在我正在读这篇教程中,Dave创建一个页面,该页面在标签中显示服务器日期,而不使用更新面板。
我正在学习如何创建使用ajax进行部分回发的服务器控件,其中控件中的方法是从同一个控件生成的clientscript调用的,我认为学习如何将此页面转换为服务器控件将有助于我理解服务器控件使用什么,而不是webmethods将其方法公开给客户端脚本。
我创建了页面、代码隐藏和javascript,就像文章所指出的那样,并使示例正常工作。
因此,为了开始尝试将其转换为服务器控件,我将Dave的页面Javascript移到了一个文件~test/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未定义此错误PageMethods.GetCurrentDate(OnSucceeded,OnFailed);
如何从控件注册的客户端脚本调用GetCurrentDate?
发布于 2008-12-03 17:33:46
实际上还没有完全封装的方法来实现对服务器控件方法的AJAX回调,从v3.5开始。这是一个非常令人沮丧的限制。
最常见的解决方案是在服务器控件的程序集中创建HttpHandler,然后要求在web.config中注册处理程序。例如,看看ASP.NET AJAX的ScriptResource.axd是如何在ASP.NET AJAX 1.0的web.config中连接起来的。
https://stackoverflow.com/questions/337978
复制相似问题