可能是最漂亮的非静态Page Method解决方案
2006-12-28 13:38
190 查看
在我前一片文章《浅谈实例Page Method到静态Page Method的移植》中,我提到了两种属于work around的解决方案,的确有效,如果可以的话我也建议尽可能地改成那样,尤其是第一种“在客户端获得参数信息”的做法,性能很高,值得推荐。
不过从“技术”方面来考虑,这两个做法都不如现在这种来得漂亮。我尝试着实现了一个HttpModule,只要使用了它就能轻松使用原来的“非静态
Page Method”了,这几乎完全解决了ASP.NET AJAX中无法使用非静态Page
Method的问题,CTP时期程序的移植也变得再容易不过。 使用方式: 下面我将简单介绍一下这个HttpModule的使用方法。我提供了一个程序集NonstaticPageMethod.dll,它提供了一个PageMethodModule,我们首先需要将其添加到web.config中去: 添加PageMethodModule
然后建立一个页面Default.aspx,放置一个ScriptManager、两个文本框以及一个触发方法用的超级链接:
Default.aspx
然后就是在Code Behind里实现实例的Page Method了,由于我复用了ASP.NET AJAX中客户端访问Web Service方法的部分内部类,因此我们只要把它当作普通Web Service来标记Custom Attribute就可以了:
Default.aspx.cs
剩下的就是在客户端实现访问Page
Method类似的JavaScript了,只需通过NonstaticPageMethod来访问方法即可(方法签名:
NonstaticPageMethods.MethodName(arg1, arg2, ..., argN, onSuccess,
onFailure, userContext)):
JavaScript代码
使用方法就是这么简单,几乎和CTP时完全相同。由于实现中复用了ASP.NET AJAX程序集的部分代码,因此也能够支持复杂的参数类型。
使用效果:
打开页面,在文本框内输入字符,点击超级链接,可以看到结果:
已知问题:
目前的NonstaticPageMethod.PageMethodModule实现得还不完美,目前来说至少还有以下问题:
没有为客户端Proxy脚本(可以通过“Default.aspx/js”查看)添加缓存的支持。
目前的脚本没有区分Debug和Release模式。
目前没有生成客户端“类型代理”的支持,即现在无法在客户端使用new CustomType()的方式生成对象,不过它不影响方法对于复杂数据类型的支持。
程序集与示例下载:
点击这里可以下载NonstaticPageMethod.dll以及示例代码。
源代码和实现方式和原理,我会在将其完善之后再进行公开。不过请注意,这个实现只是为了学习和研究之用,除非万不得已,请不要使用它,非静态的Page Method有其天生的劣势,请尽量使用《浅谈实例Page Method到静态Page Method的移植》中的第一种做法。:)(本文内容使用了Microsoft Permissive License (Ms-PL))
不过从“技术”方面来考虑,这两个做法都不如现在这种来得漂亮。我尝试着实现了一个HttpModule,只要使用了它就能轻松使用原来的“非静态
Page Method”了,这几乎完全解决了ASP.NET AJAX中无法使用非静态Page
Method的问题,CTP时期程序的移植也变得再容易不过。 使用方式: 下面我将简单介绍一下这个HttpModule的使用方法。我提供了一个程序集NonstaticPageMethod.dll,它提供了一个PageMethodModule,我们首先需要将其添加到web.config中去: 添加PageMethodModule
<httpModules> ... <add name="NonstaticPageMethodModule" type="NonstaticPageMethod.PageMethodModule, NonstaticPageMethod"/> </httpModules>
然后建立一个页面Default.aspx,放置一个ScriptManager、两个文本框以及一个触发方法用的超级链接:
Default.aspx
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br /> <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br /> <a href="javascript:onClick();">Click Here</a>
然后就是在Code Behind里实现实例的Page Method了,由于我复用了ASP.NET AJAX中客户端访问Web Service方法的部分内部类,因此我们只要把它当作普通Web Service来标记Custom Attribute就可以了:
Default.aspx.cs
[ScriptService] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } [ScriptMethod] [WebMethod] public string ConcateText(string split) { return this.TextBox1.Text + split + this.TextBox2.Text; } }
剩下的就是在客户端实现访问Page
Method类似的JavaScript了,只需通过NonstaticPageMethod来访问方法即可(方法签名:
NonstaticPageMethods.MethodName(arg1, arg2, ..., argN, onSuccess,
onFailure, userContext)):
JavaScript代码
function onClick() { NonstaticPageMethods.ConcateText('|', onSuccess); } function onSuccess(result) { alert(result); }
使用方法就是这么简单,几乎和CTP时完全相同。由于实现中复用了ASP.NET AJAX程序集的部分代码,因此也能够支持复杂的参数类型。
使用效果:
打开页面,在文本框内输入字符,点击超级链接,可以看到结果:
已知问题:
目前的NonstaticPageMethod.PageMethodModule实现得还不完美,目前来说至少还有以下问题:
没有为客户端Proxy脚本(可以通过“Default.aspx/js”查看)添加缓存的支持。
目前的脚本没有区分Debug和Release模式。
目前没有生成客户端“类型代理”的支持,即现在无法在客户端使用new CustomType()的方式生成对象,不过它不影响方法对于复杂数据类型的支持。
程序集与示例下载:
点击这里可以下载NonstaticPageMethod.dll以及示例代码。
源代码和实现方式和原理,我会在将其完善之后再进行公开。不过请注意,这个实现只是为了学习和研究之用,除非万不得已,请不要使用它,非静态的Page Method有其天生的劣势,请尽量使用《浅谈实例Page Method到静态Page Method的移植》中的第一种做法。:)(本文内容使用了Microsoft Permissive License (Ms-PL))
相关文章推荐
- 可能是最漂亮的非静态Page Method解决方案
- 可能是最漂亮的非静态Page Method解决方案
- 网上邻居无法访问您可能没有权限使用网络资源解决方案
- CentOS 7编译安装php7.0.7以及可能遇到的问题的解决方案
- TF54000: 由于服务器时钟设置可能不正确,无法更新数据解决方案(补充)
- 在Atlas服务器端实现中推荐使用Web Service而不是Page Method
- IE下预览pdf失败可能及解决方案
- Win10一周年更新冻屏可能原因解决方案
- ascx + wrapper page + jQuery的Ajax解决方案
- 输入列画表格 在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。 有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看)输入列
- Jquery 调用asp.net ajax (web service/static page method)的示例(一)---简单参数
- 关于pageadmin配置过程中没有安全选项的问题解决方案
- 【Android】WebView找不到网页,可能暂时出现故障解决方案
- Eclipse:控制台报错误: Unable to execute dex: method ID not in [0, 0xffff]: 65536 解决方案
- annotation:@Override出现The method of type must override asuperclass解决方案
- SenchaTouch中出现数据覆盖 以及 “Cannot call method 'setData' of nul”l错误的可能原因
- “您可能没有权限使用网络资源”解决方案
- 安装ECShop报 Non-static method cls_image::gd_version() should not be called statically 解决方案
- ASP.Net中Page Method的执行顺序