プログラミングのメモ用BLOGです 自己紹介:あんどれ へっぽこプログラマです

ラベル

2007年6月19日

WebServiceの戻り値に利用しているDataSet,DataTableをJSONに変換する(asp.net ajax利用)

Jason氏のAjaxComponentLibraryを利用します。
1.(a Weblog by Jason Diamond)からJacl Release 3をダウンロードする。
http://jason.diamond.name/weblog/2007/06/07/jacl-release-3
  のrelease からダウンロードできます。(This was posted by Jason Diamond on Thursday, June 7th, 2007 at 2:57 pm.)

ネタ元:@ITの掲示板「件名:ajaxの返す値が2つ以上の場合」(※1)

2.Jacl-3.zipを解凍してビルド。AjaxComponentLibrary.dllを探して(※2)コピー。自分のプロジェクトから参照できるようにする。

3.利用する。
(1)Web.configに以下の内容(※3)を追加


<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="DataConverter" type="AjaxComponentLibrary.DataConverter" />
</converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>

(2)後は、普通に使えます。

[WebMethod]
public DataTable GetData()
{
DataTable dt = new DataTable();

dt.Columns.Add("id", typeof(string));
dt.Columns.Add("title", typeof(string));

dt.Rows.Add(new object[] { "0001", "Table Convert" });
dt.Rows.Add(new object[] { "0002", "Good Job!" });

return dt;
}


responseデータ(firebugで確認)
{"columns":["id","title"],"rows":[{"id":"0001","title":"Table Convert"},{"id":"0002","title":"Good Job!"}],"__type":"System.Data.DataTable"}

※1 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24246&forum=7
※2 ?ajaxcomponent3\Jacl\AjaxComponentLibrary\bin\Debug\AjaxComponentLibrary.dll
※3 詳細は、http://ajax.asp.net/docs/ConfiguringASPNETAJAX.aspxのThe <system.web.extensions> Elementを参照


以下は、思いついたことを適当に・・・
・Web.configの<jsonSerialization>で設定した情報をどこで使っているかまではみていない。誰か調べた方がいたら教えてほしいです^^;
・JavaScriptConverterを継承したDataConverterでDataSet,Datatableをジェネリクス型のDistionaryに変換している。
・XMLから直接JSONにするなら参考になるかも。簡単にできなさそうだったので見ただけ。
 HttpWebRequest を使用して ASP.NET AJax のメソッドを呼び出す(1)
 HttpWebRequest を使用して ASP.NET AJax のメソッドを呼び出す(2)
How to convert XML to JSON in ASP.NET C#→これもXMLをJSONにする方法。例がわかりやすそう。

・Jason's AJAX Component LibraryのサンプルWebsiteには他にもすばらしいコンポーネントサンプルがあるが必要になったら見ることにする。

An introduction to extender controls and behaviors
Extender control examples

* ReorderColumnsExtender
* ResizeColumnsExtender
* SelectActionExtender
* SortRowsExtender
* TableDataBinderExtender
* TableRowCheckedChangedExtender
* TextBoxImageButtonExtender
* TextChangedExtender

Non-visual component examples

* TextSizeWatcher

Other examples

* Returning DataSet and DataTable objects from web services
* Using both ReorderColumnsExtender and ResizeColumnsExtender on the same target
* Using both ReorderColumnsExtender and SortRowsExtender on the same target
* Persisting sorted tables with cookies

2007年6月17日

Calling Web Services from Client Script in ASP.NET AJAXのメモ

Calling Web Services from Client Script in ASP.NET AJAXを読んだのでメモ書き。

Calling Web Services from Client Script in ASP.NET AJAX
http://ajax.asp.net/docs/tutorials/ConsumingWebServicesWithAJAXTutorial.aspx

初めに
JavaScriptからWebサービスを呼び出すための方法について
・WEBサービス利用のためにページ上にプロキシクラス(javascript)を生成する。設定方法等。

WEBサービスを呼び出す方法


・値を返さないWEBサービスの呼び出し
・値を返すWEBサービスの呼び出し
・パラメータを取るWEBサービスメソッドの呼び出し
・「HTTP GET」を使うWEBサービスメソッドの呼び出し
・XMLドキュメントを返すWEBサービスメソッドの呼び出し

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.CallWebServiceMethods/cs/CallWebServiceMethods.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.CallWebServiceMethods%23CallWebServiceMethods.aspx


デフォルトプロパティとしての個別コールバック関数

パラメータを並べなくても個別コールバック関数を利用すれば以下の事を別々に処理できる。
メリットはWEBサービスを呼び出すシンタックスが簡潔になります。
・成功時の処理
・失敗時の処理
・ユーザーコンテキストを使った処理
・引数を利用する処理

プロキシクラスのインスタンス上のプロパティとしてコールバック関数を設定する

プロキシクラスのインスタンスを作るとWEBサービスのメソッドを複数呼びだしたり、別々の初期値を設定できる。

追加情報:プロキシクラスの生成についての説明
http://ajax.asp.net/docs/ClientReference/Sys.Net/GeneratedProxyClasses/default.aspx

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.UsingProxyClass/cs/default.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.CallWebServiceMethods%23CallWebServiceMethods.aspx

[メモ1]
UsingProxyClass.jsのpageload()はwindows.pageload()?ページがロードされる前の事前準備のイベント。
[メモ2]
次に呼び出すWEBサービスを事前に指定することによって、成功時、失敗時、ユーザーコンテキスト、引数の関数を個々に呼べるかわりに、呼び出されたWEBメソッドが何だったかを判断する必要あり。(methodName)

例:SucceededCallbackの場合
// Callback function invoked when the call to
// the Web service methods succeeds.
function SucceededCallback(result, userContext, methodName)
{
var message;
switch(methodName)
{
case ("GetDefaultColor"):
case ("SetColor"):
{
// Get the server default color.
message = result.message;
defaultRgb = result.rgb;


// Transform the rgb array into a string.
var serverColor = defaultRgb[0]+ defaultRgb[1] + defaultRgb[2];

// Display the result.
displayResult.style.color = "yellow";
displayResult.style.fontWeight = "bold";
displayResult.style.backgroundColor = "#" + serverColor;
DisplayMessage(message);
break;
}
default:
{
DisplayMessage("Method unknown");
}
}
}


WEBサービスメソッドの呼び出し中にエラーをハンドリングする

WebServiceMethodError.js Samples.AspNet.WebService.Div(a, b, SucceededCallback, FailedCallback);
に対してa=10、b=0をセット(処理は10/0で0除算のエラー)してFailedCallbackに流れる処理(エラーのハンドリング)のサンプル。

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.ErrorHandlingTutorial/cs/WebServiceMethodError.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.ErrorHandlingTutorial%23WebServiceMethodError.aspx


複数のWEBメソッドから1つのコールバックを呼ぶ

引数の数、セットする値(※)によってコールバック内の処理を呼び分ける方法についてのサンプル。
[メモ2]の拡張。呼び出す条件に「ユーザーコンテキストの有無」「メソッド名の有無」を利用

※呼び出しのサンプル
Samples.AspNet.WebService.Add(a, b,
SucceededCallbackWithContext, FailedCallback, userContext, null);

Samples.AspNet.WebService.Add(a, b,
SucceededCallbackWithContext, FailedCallback);

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.MultipleCallers/cs/MultipleCallers.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.MultipleCallers%23MultipleCallers.aspx

複合型を返す

WEBサービスの戻り値をJavaScriptのオブジェクト(JSON)で返すことについてのサンプル。
ASP.NET側(HandleColor.asmx)のWEBサービスメソッドは、ColorObjectクラス(文字列を返すpublicメソッドが3つ)
WEBサービスメソッドに[GenerateScriptType(typeof(ColorObject))]属性を付加。
HandleColor.js側ではJavaScriptオブジェクト(JSON)で処理可能になる。

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.ReturnComplexType/cs/Default.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.ExchangeComplexTypes

ジェネリクスや配列(array)型を返す

ジェネリクスや配列(array)型を返すWEBサービスのサンプル。
・ジェネリクスのList型が戻り値。generics.js側ではJSONで処理できる。
※SimpleClassはカスタムクラス
※WEBサービスメソッドに[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]属性がなくても同じ結果。

・ジェネリクスのDistionary<String, String>型が戻り値。generics.js側ではJSONで処理できる。

・ジェネリクスのDistionary<String, SimpleClass2>型が戻り値。generics.js側ではJSONで処理できる。
※SimpleClass2はカスタムクラス

・ジェネリクスのDistionary型を引数にして呼び出す。generics.js側ではJSONで引数をセット。(Samples.AspNet.TestService.PassGenericDictionary({"first":simple});)
※WEBサービスクラスに[GenerateScriptType(typeof(SimpleClass2))]属性が必要

※※引数の型が1つの場合、List型が引数の時は属性は必要なかった。(Samples.AspNet.TestService.PassGenericList([simple]);)

根拠になりそうな箇所を抜粋
Passing Parameters Typed as Generics or Arrays
However if a generic type takes more than one type argument, such as Dictionary<string, <T>>, ASP.NET AJAX does not generate proxy classes for the types.

・配列型(Array)が戻り値。generics.js側では配列型で処理できる。

動くサンプル
http://ajax.asp.net/docs/Samples/Sys.Net.WebServiceGenerics/cs/default.aspx
サンプルソース
http://ajax.asp.net/docs/ViewSample.aspx?sref=Sys.Net.WebServiceGenerics%23default.aspx


Enumerators型を返す

You cannot access enumerators by using instances of the generated proxy class.
サンプルがエラー無理らしい。