3

私が読んでいるこのチュートリアルでは、Dave Ward が、更新パネルを使用せずにサーバーの日付をラベルに表示するページを作成しています。

コントロール内のメソッドが同じコントロールによって生成された clientscript から呼び出される部分的なポストバックに ajax を使用するサーバー コントロールを作成する方法を学ぼうとしています。このページをサーバー コントロールに変換する方法を学ぶことは、理解に役立つと思います。メソッドを clientscript に公開するために、webmethods の代わりにサーバーコントロールが使用するもの。

記事に示されているとおりにページ、分離コード、JavaScript を作成し、サンプルを動作させました。

そこで、これをサーバー コントロールに変換する試みを開始するために、ページの Dave の Javascript をファイル ~tests/JScript.js に移動しました。

 function UpdateTime() {
   PageMethods.GetCurrentDate(OnSucceeded, OnFailed); 
 }
 
 function OnSucceeded(result, userContext, methodName) {
   $get('Literal1').innerHTML = result; 
 }
 
 function OnFailed(error, userContext, methodName) {
   $get('Literal1').innerHTML = "An error occured.";
 }

そして、次のクラスを App_Code に入れます。

namespace foo
{
    /// <summary>
    /// Summary description for ServerControlTest
    /// </summary>
    public class ServerControlTest : CompositeControl, IScriptControl
    {
        ScriptManager sm;
        protected override void OnPreRender(EventArgs e)
        {
            if (!this.DesignMode)
            {
                // Test for ScriptManager and register if it exists
                sm = ScriptManager.GetCurrent(Page);

                if (sm == null)
                    throw new HttpException("A ScriptManager control must exist on the current page.");

                sm.RegisterScriptControl(this);
                sm.EnablePageMethods = true;
            }

            base.OnPreRender(e);
        }

        protected override void OnLoad(EventArgs e)
        {
            Literal lit = new Literal();
            lit.Text = "<span ID=\"Literal1\" runat=\"server\">test</span><input id=\"Button1\" type=\"button\" value=\"button\"  onclick=\"UpdateTime();\" />";

            this.Controls.Add(lit);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            if (!this.DesignMode)
                sm.RegisterScriptDescriptors(this);

            base.Render(writer);
        }

        [WebMethod]
        public static string GetCurrentDate()
        {
            return DateTime.Now.ToString();
        }

        #region IScriptControl Members

        IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
        {
            return null;
        }

        IEnumerable<ScriptReference> IScriptControl.GetScriptReferences()
        {
            ScriptReference reference = new ScriptReference();
            reference.Path = ResolveClientUrl("~/tests/JScript.js");

            return new ScriptReference[] { reference };
        }

        #endregion
    }
}

サンプル ページでボタンをクリックすると、次のエラー が表示されます。 PageMethods is not defined [Break on this error] PageMethods.GetCurrentDate(OnSucceeded, OnFailed);

コントロールが登録する clientscript から GetCurrentDate を呼び出すにはどうすればよいですか?

4

1 に答える 1

2

実際には、v3.5 の時点で、サーバー コントロールのメソッドに対して AJAX コールバックを実装するための完全にカプセル化されたメソッドはまだありません。これは非常にイライラする制限です。

最も一般的な解決策は、サーバー コントロールのアセンブリに HttpHandler を作成し、そのハンドラーを web.config に登録することを要求することです。たとえば、ASP.NET AJAX の ScriptResource.axd が ASP.NET AJAX 1.0 の web.config でどのように接続されているかを見てください。

于 2008-12-03T17:33:46.710 に答える