ScriptManager と ToolkitScriptManager

ASP.NETAjax を使用する場合は ScriptManager をページ内に設置しますが、 Ajax Control Toolkit を採用している場合は ToolkitScriptManager が利用できます。 ScriptManager と ToolkitScriptManager で基本的な機能は同等ですが、多数の js ファイルが読み込まれる場合、 ToolkitScriptManager の性能の方が良いようです。

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManagerMain" runat="server">
</ajaxToolkit:ToolkitScriptManager>

どちらを使用しても OK ですが、検証した範囲内で特に問題はなさそうなので ToolkitScriptManager を使用しています。

JavaScript から WebMethod を呼び出す方法

この記事では、 ASP.NET 2.0 AJAX Extensions を使用して「JavaScript から WebMethod を呼び出す方法」について説明します。 *1

WebService の作成

まず、 WebService を作成します。 Visual Studio の「新しい項目の追加」から「Web サービス」を選択し、「Sample.asmx」を作成してください。このサンプル記事では、ウィザードによって作成された HelloWorld() を以下のように修正します。

using System;
using System.Web.Script.Services;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class Sample : System.Web.Services.WebService
{
    [WebMethod]
    public string GetSample(string name)
    {
        return "Hello World: " + name;
    }
}

HelloWorld() の名称を GetSample(string name) とし、引数をとるように変更しました。また、 ScriptService 属性 (System.Web.Script.Services 名前空間) をクラスの属性として追加しました。 JavaScript から WebMethod を呼び出すには、 ScriptService 属性 が必要になります。

ToolkitScriptManager の設定 (Sample.asmx を参照する)

ToolkitScriptManager の Services を以下のように設定します。 Path 属性は、各自の環境で作成した Sample.asmx を指すように変更します。

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManagerMain" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebService/Sample.asmx" />
    </Services>
</ajaxToolkit:ToolkitScriptManager>

以上で、 JavaScript から WebService を呼び出す準備が完了しました。

JavaScript の記述

// ボタンクリック時に、非同期で GetSample() を呼び出す
function OnSampleButtonClick()
{
    // GetSample() は引数を 1 つとるため、 "yamada" は GetSample() に渡されます。
    // (以下で指定した引数の頭から順に、作成した WebMethod の引数分だけ渡されます。)
    Sample.GetSample("yamada", onComplete, onError, "spanResult");
}

// GetSample() の呼び出しが成功した場合
function onComplete(result, context)
{
    $get(context).innerText = result;
}

// GetSample() の呼び出しが失敗した場合
function onError(error)
{
    alert(error.get_message());
}

呼び出し元のボタンと span 要素は以下のようになります。ボタンをクリックすることで OnSampleButtonClick() が呼び出され、span 要素に結果が書き込まれます。

<asp:Button ID="ButtonSample" runat="server" Text="GetSample" OnClientClick="OnSampleButtonClick(); return false;" /> <span id="spanResult"></span>

参考文献

以上、 JavaScript から WebMethod を呼び出す基本的な方法について説明しました。より詳しい内容を知りたい場合、以下のサイトを確認してください。

*1:ASP.NETJavaScript に関する基本的な知識は有しているものとします。

ページ内の WebMethod (PageMethod) を呼び出す

ページ内の WebMethod (PageMethod) を JavaScript から呼び出すには、 ScriptManager の EnablePageMethods 属性を true に設定します。 (Ajax Control Toolkit を使用する機会が多いため、以下の例では ToolkitScriptManager を使用しています。)

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManagerMain" runat="server" EnablePageMethods="True">
</ajaxToolkit:ToolkitScriptManager>

JavaScript 側からの呼び出しには、 PageMethods を使用します。

function OnSampleButtonClick()
{
    // .aspx.cs などコードビハインドに GetSample() という WebMethod を作成した場合
    PageMethods.GetSample(onComplete, onError, "spanResult");
}

ScriptManagerProxy の用途

ScriptManager (ToolkitScriptManager) はページ内に 1 つしか配置することができません。そのため、マスタページに ScriptManager が含まれていて、各ページ内でサービスを参照する必要がある場合は、 ScriptManagerProxy を使用します。使用例は以下のようになります。

<asp:ScriptManagerProxy ID="ScriptManagerProxyMain" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebService/Sample.asmx" />
    </Services>
</asp:ScriptManagerProxy>