by WebSurfer
2012年7月14日 16:43
jQuery.ajax で form データを送信する方法です。ちょっとハマったので忘れないように書いておきます。
例えば、"日本語" と "URL エンコードされるか?" という文字列を送信する場合は以下のようにします。
data: 'aaa=' + '<%=Server.UrlEncode("日本語")%>' +
'&bbb=' + '<%=Server.UrlEncode("URL エンコードされるか?")%>'
または、
data: { aaa: '日本語', bbb: 'URL エンコードされるか?' }
後者は、"日本語" および "URL エンコードされるか?" という文字列を自動的に UrlEncode して、前者と同様な form データを作って送信してくれるので、こちらの方がお勧めです。
上の画像は、以下の jQuery Ajax のコードでデータを送信した時、送信データを Fiddler でキャプチャしたものです。URL エンコードされているのが分かります。
$.post("152-jQueryAjaxXml.asmx/GetXml",
{ aaa: '日本語', bbb: 'URL エンコードされるか?' },
function (data, textStatus, jqXHR) {
$('#output').text(data.xml);
}
);
by WebSurfer
2012年7月4日 23:20
ASP.NET フォーム認証用のユーザー情報のストアとして SQL Server を用いる場合、サーバーでのデータベースの作り方を備忘録として書いておきます。
開発環境では、開発マシンに Visual Studio と SQL Server がインストールされていれば、Visual Studio の「ASP.NET Webサイト管理ツール」が、フォーム認証用のデータベースファイル ASPNETDB.MDF をアプリケーションルート直下の App_Data フォルダに自動生成してくれます。
自分がサーバーの管理者であれば、開発マシンの ASPNETDB.MDF ファイルをサーバーにコピーして使うことができます。(もしくは、下に述べるデータベース作成用のスクリプトを SQL Server Management Studio を使って実行する手もあります)
しかしながら、ホスティングサービス(レンタルサーバー)を利用している場合は上記のようなことはできません。ホスティングサービス会社に、自分が作った ASPNETDB.MDF を送って SQL Server にアタッチしてもらうのも望み薄です。
では、どうするかと言えば、通常、ホスティングサービス会社が SQL Server の管理ツールを提供しているはずなので、そのツールからスクリプトを走らせることができれば、遠隔地にあるサーバーにデータベースを作成することができるはずです。
以下に、自分が使っているホスティングサービス(ActiveWeb)の場合の例を書きます。ActiveWeb の管理ツールは Plesk と myLittleAdmin です。ExpressWeb の場合も、同じ会社がサービスしているので、手順は大筋で同じです。(他のホスティングサービスの場合は不明です。無責任モードですみません)
-
まず、ホスティングサービス会社が提供しているツールを使って SQL Server にデータベースを作成し、ユーザーの設定をします。その時点で、データベース名、ユーザー名、パスワードが決まるはずですが、それらは、それぞれ、接続文字列の Initial Catalog、User ID、Password に設定するので覚えておいてください。(接続文字列の Server に設定するサーバー名は、別にホスティングサービス会社より通知されていると思います)
-
次に、自分の開発マシンで、aspnet_regsql.exe を利用して、必要な機能(テーブル、ストアドプロシージャ、トリガ)を上記 (1) で作ったデーターベースに追加するための SQL スクリプトファイルを生成します。以下のようにコマンドラインから入力します。この例で、FormsAuth は上記 1 で指定したデータベース名、script.sql は生成する SQL スクリプトファイルの名前です。
-
ホスティングサービス会社が提供している SQL Server の管理ツールを使用して、上記 2 で作ったスクリプトを走らせ、データベースにテーブル、ストアドプロシージャ、トリガを作成します。ActiveWeb、ExpressWeb の場合は myLittleAdmin を利用します。下の画像を参照してください。「新しいクエリ」という文字の下にある 印のボタンをクリックすると、ファイルを選択するダイアログが開きますので、それでステップ 2 で作ったスクリプトを指定します。
-
接続文字列を実環境に合わせて修正します。開発環境は、開発マシンの SQL Server Express に Windows 認証でユーザーインスタンスを利用して接続しているのを、レンタルサーバーでは Express 版でない SQL Server の既定のインスタンスに SQL Server 認証で接続するのが普通だと思います。その場合、接続文字列は以下のようになるはずです。不明な点はレンタルサーバー会社に確認してください。
開発環境(Visual Studio が自動生成)
<connectionStrings>
<add name="ApplicationServices"
connectionString=
"data source=.\SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|\aspnetdb.mdf;
User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
運用環境
<connectionStrings>
<add name="ApplicationServices"
connectionString=
"Server=サーバー名;
User ID=ユーザー名;
Password=パスワード;
Initial Catalog=データベース名"
providerName="System.Data.SqlClient" />
</connectionStrings>
-
ここまでで ASPNETDB.mdf 相当のデータベースが生成され、Web アプリから接続できるようになっているはずです。ただし、データベースのテーブルの中身は空なので、自分でユーザー登録とロールの設定が必要です。
管理用のページを作るなりしないとユーザー登録やロールの設定はできないので、そこが少々面倒かも知れません。参考に、指定されたユーザーを指定されたロールに追加するサンプルコードのある MSDN ライブラリのページ Roles.AddUserToRole メソッド を紹介しておきます。
それが問題であれば、開発環境で作ったユーザー登録やロールが設定済みの ASPNETDB.mdf から、Database Publishing Wizard を利用してスクリプトを生成すれば、上記 5 の手順は不要になるはずです。
by WebSurfer
2012年7月2日 22:28
C# を使った .NET Framework アプリでのイベントとハンドラの宣言、定義の方法を忘れかけていて余計な時間がかかったので、整理して、備忘録として簡単に書いておきます。
まず、イベントを宣言するには、その前にデリゲート型の宣言が必要です(EventHandler デリゲートのようにクラスライブラリに用意されている場合は不要です)。
C# のデリゲートは、C や C++ の関数ポインタと同じと考えればよいと思います。以下の例は、Object 型と EventArgs 型の引数を持つデリゲート型 ChangedEventHandler の宣言です。
public delegate void
ChangedEventHandler(object sender, EventArgs e);
上の構文は、メソッド宣言の構文と同様ですが、delegate キーワードによって、ChangedEventHandler がデリゲート型であることをコンパイラに通知しています。
規約により、.NET Framework のイベントデリゲートは、そのイベントの発生元(上の例では sender)と、そのイベントのデータ(上の例では e)という 2 つのパラメータを持ちます。
デリゲートを定義した後、イベントの実装は以下のように行います。細かい説明はコメントを参照してください。
public class MyClass : ArrayList
{
// デリゲートを用いてイベントを宣言。クラスの外からは
// 公開フィールドのように見えるが、アクセスには制限が
// あり、実行できるのは以下の処理のみ。
// ・新しいデリゲートの結合
// ・結合されたデリゲートの削除
public event ChangedEventHandler Changed;
// イベントを起動するメソッド OnChanged を作成し
// ておき、必要なタイミングで呼び出す。イベントは、イ
// ベントを宣言したクラスの中からしか起動できない。そ
// れゆえ、protected として作成し、派生クラスがイベン
// トを起動できるようにする。
protected virtual void OnChanged(EventArgs e)
{
// ハンドラがイベントにアタッチされてない場合 null
// になるので、起動する前に null でない事を確認。
if (this.Changed != null)
{
this.Changed(this, e);
}
}
// 例えば、何かを追加したタイミングでこのイベントを発
// 生させたいときは、以下のようにする。
public override int Add(object value)
{
int i = 0;
// 何かの処置
OnChanged(EventArgs.Empty);
return i;
}
}
ここまでの宣言、定義で、MyClass.Add メソッドが起動された時、MyClass.Changed イベントが発生します。
ただし、ハンドラの定義、ハンドラのイベントへのアタッチがないので、それ以上は何も起こりません。
ハンドラの定義とイベントへのアタッチは以下の例のようにします。
public class EventListener
{
private MyClass _myClass;
public EventListener(MyClass myClass)
{
this._myClass = myClass;
// ハンドラをイベントにアタッチ
this._myClass.Changed +=
new ChangedEventHandler(MyClass_Changed);
}
// ハンドラの定義
private void MyClass_Changed(object sender, EventArgs e)
{
// 何かの処理
}
}