3

我正在阅读的本教程中,Dave Ward 创建了一个页面,该页面在标签中显示服务器日期,而不使用更新面板。

我正在尝试学习如何创建使用 ajax 进行部分回发的服务器控件,其中控件中的方法是从同一控件生成的客户端脚本调用的,我认为学习如何将此页面转换为服务器控件将有助于我理解servercontrols 使用什么而不是 webmethods 来将它们的方法公开给 clientscript。

我完全按照文章中的说明创建了页面、代码隐藏和 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);

如何从我的控件注册的客户端脚本中调用 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 回答