
??此文章摘自《ASP.NET AJAX程式设计:第II卷(客户端)》定价:55元 特价:41.25元 购买>>
让客户端JavaScript 直接异步调用服务器端的Web Service,这看起来真的是个不错的主意??理想化的分层Ajax应用程式就应该这样嘛!但是作为被ASP.NET服务器端研发模型“宠坏”了的我们,更加熟悉的方法是直接将方法写在ASP.NET页面中。比如在处理页面中的某个服务器端按钮Click事件的代码时,就可能这样调用定义在同一个页面代码文档中的方法: protected void Button1_Click(object sender, EventArgs e) { myLabel.Text = this.GetTextForLabel(); } public string GetTextForLabel() { // ...... return "Some Text"; }
对于那些“遗留”的ASP.NET应用程式来讲,这样直接定义在ASP.NET页面中的方法更是相当常见。若是仅仅为了配合ASP.NET AJAX的客户端访问Web Service功能,就将这些方法一一迁移到Web Service中,岂不是很麻烦?
好在ASP.NET AJAX在设计时考虑到了这个问题,并提供给我们一种作为替代的选择。ASP.NET AJAX异步通信层能够将声明在ASP.NET页面中公有的类方法(C#中的static,VB.NET中的Shared)当作Web Service中声明的方法相同对待,为其生成类似的客户端调用代理。
我们还是通过一个实例程式来了解这个功能。该示例程式的功能和界面和前一节中的完全一致,唯一的不同就是,客户端异步调用的不再是某个Web Service,而是定义在ASP.NET页面中的类方法。
首先是定义在ASP.NET页面中的类方法,完整的方法声明如下: [WebMethod] public static string SayHelloFromPage(string name) { return string.Format("Hello {0}!", name); }
特别需要注意的是,若要让ASP.NET AJAX为其生成客户端调用代理,那么一定要为该方法添加[WebMethod]属性。
然后是ScriptManager控件,注意粗体部分代码配置了EnablePageMethods属性为true,这也是让客户端能够直接调用服务器端页面方法所必需的。若忘记设定该属性,那么程式将无法完成预期功能:
程式界面中的UI元素和前一节示例程式中的完全一致,这里不赘: onclick="return btnInvoke_onclick()" />
而本示例程式中按钮的click事件处理函数连同异步调用的回调函数则需要一定的修改,如下所示: function btnInvoke_onclick() { var theName = $get("tbName").value; PageMethods.SayHelloFromPage(theName, onSayHelloSucceeded); }
[1] [2]
|