Hello World
Spiga

可能是最漂亮的非静态Page Method解决方案

2006-12-28 13:38 by 老赵, 7827 visits

在我前一片文章《浅谈实例Page Method到静态Page Method的移植》中,我提到了两种属于work around的解决方案,的确有效,如果可以的话我也建议尽可能地改成那样,尤其是第一种“在客户端获得参数信息”的做法,性能很高,值得推荐。

不过从“技术”方面来考虑,这两个做法都不如现在这种来得漂亮。我尝试着实现了一个HttpModule,只要使用了它就能轻松使用原来的“非静态Page Method”了,这几乎完全解决了ASP.NET AJAX中无法使用非静态Page Method的问题,CTP时期程序的移植也变得再容易不过。

 

使用方式:

下面我将简单介绍一下这个HttpModule的使用方法。我提供了一个程序集NonstaticPageMethod.dll,它提供了一个PageMethodModule,我们首先需要将其添加到web.config中去:

<httpModules>
    ...
    <add name="NonstaticPageMethodModule"
        type="NonstaticPageMethod.PageMethodModule, NonstaticPageMethod"/>
</httpModules>

 

然后建立一个页面Default.aspx,放置一个ScriptManager、两个文本框以及一个触发方法用的超级链接:

<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就可以了:

[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)):

function onClick()
{
    NonstaticPageMethods.ConcateText('|', onSuccess);
}

function onSuccess(result)
{
    alert(result);
}

 

使用方法就是这么简单,几乎和CTP时完全相同。由于实现中复用了ASP.NET AJAX程序集的部分代码,因此也能够支持复杂的参数类型。

 

使用效果:

打开页面,在文本框内输入字符,点击超级链接,可以看到结果: 

 

已知问题:

目前的NonstaticPageMethod.PageMethodModule实现得还不完美,目前来说至少还有以下问题:

  1. 没有为客户端Proxy脚本(可以通过“Default.aspx/js”查看)添加缓存的支持。
  2. 目前的脚本没有区分Debug和Release模式。
  3. 目前没有生成客户端“类型代理”的支持,即现在无法在客户端使用new CustomType()的方式生成对象,不过它不影响方法对于复杂数据类型的支持。

 

程序集与示例下载:

点击这里可以下载NonstaticPageMethod.dll以及示例代码。

源代码和实现方式和原理,我会在将其完善之后再进行公开。不过请注意,这个实现只是为了学习和研究之用,除非万不得已,请不要使用它,非静态的Page Method有其天生的劣势,请尽量使用《浅谈实例Page Method到静态Page Method的移植》中的第一种做法。:)

(本文内容使用了Microsoft Permissive License (Ms-PL)

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

21 条回复

  1. 老赵
    admin
    链接

    老赵 2006-12-27 23:36:00

    非静态Page Method移植的三种方法优劣排名:
    1、在客户端获得参数,并传递到服务器端的静态Page Method。
    2、NonstaticPageMethod.PageMethodModule
    3、UpdatePanel(这种……有了PageMethodModule之后几乎没有任何必要了)

  2. 老赵
    admin
    链接

    老赵 2006-12-27 23:37:00

    本来想加些Licence信息的,才意识到现在无法访问外国网,只能明天再说了……
    发现这又是一个根据别人的问题才产生想法的解决方案,对于我这种想象力匮乏的人,只能是从别人那里得到这样的需求了……

  3. chason[未注册用户]
    *.*.*.*
    链接

    chason[未注册用户] 2006-12-27 23:56:00

    Jeffrey Zhao 好厉害!一天之间又有了新的解决方案,看起来也很舒服一种方法和一篇文章!向你学习!

  4. chason[未注册用户]
    *.*.*.*
    链接

    chason[未注册用户] 2006-12-27 23:59:00

    "非静态的Page Method有其天生的劣势",是因为性能问题吗?很期待你的NonstaticPageMethod.dll的原理和实现方式讲解

  5. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2006-12-28 00:07:00

    @Jeffrey Zhao
    可以找几个有丰富想象力的人,和你一起做做BrainStorm之类的锻炼下,或者其他涉及想象力的游戏也可以,例如……AD&D!

  6. 老赵
    admin
    链接

    老赵 2006-12-28 00:10:00

    @chason
    其实断断续续也写了一个星期了。:)

  7. 老赵
    admin
    链接

    老赵 2006-12-28 00:12:00

    @chason
    是的,因为会将页面里所有的信息,比如所有的Input元素的内容,包括ViewState发送到服务器端用来构造整个页面树。数据传输量不会输给传统的PostBack。

  8. 老赵
    admin
    链接

    老赵 2006-12-28 00:13:00

    @Cat Chen
    AD & D是什么游戏?
    我很不会玩游戏,因为早些年从来不玩,后来也就什么游戏都上不了手了,呵呵……

  9. tttt[未注册用户]
    *.*.*.*
    链接

    tttt[未注册用户] 2006-12-28 09:09:00

    没什么

  10. 老赵
    admin
    链接

    老赵 2006-12-28 11:01:00

    @tttt
    您觉得什么比较有价值,我可以为您服务吗?:)

  11. Dflying Chen
    *.*.*.*
    链接

    Dflying Chen 2006-12-28 16:58:00

    你是怎样修改文章发表时间的呢?

  12. 老赵
    admin
    链接

    老赵 2006-12-28 17:40:00

    @Dflying Chen
    是我修改文章之后不小心点了“存为草稿”,再Edit,点“发布文章”,即使没有选择“更新发布时间”,时间也被更新了。我觉得这一点应该算是博客园的Bug。

  13. wang     yan       qio[未注册用户…
    *.*.*.*
    链接

    wang yan qio[未注册用户] 2006-12-29 00:06:00

    不错

  14. 老赵
    admin
    链接

    老赵 2006-12-29 00:40:00

    @wang yan qio
    :)

  15. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2006-12-29 09:59:00

    最近被封闭了,也没空看你帖子了,唉。。。

  16. 老赵
    admin
    链接

    老赵 2006-12-29 11:02:00

    @蛙蛙池塘
    最近在做什么呢?:)

  17. chason[未注册用户]
    *.*.*.*
    链接

    chason[未注册用户] 2007-01-02 22:50:00

    Jeffrey Zhao ,我在UserControl里面用上述的方法好像不行的,只对aspx有效,是这样吗?

  18. 老赵
    admin
    链接

    老赵 2007-01-02 23:10:00

    @chason
    是的,只在Page里有效。:)

  19. freetofly
    *.*.*.*
    链接

    freetofly 2007-01-04 13:07:00

    我到觉得最漂亮的做法是ICallbackEventHandler

  20. 老赵
    admin
    链接

    老赵 2007-01-04 13:17:00

    @freetofly
    这个远远不够,首先它就不能支持复杂类型的参数和返回值。:)

  21. luckydog[未注册用户]
    *.*.*.*
    链接

    luckydog[未注册用户] 2007-04-10 17:06:00

    我想知道NonstaticPageMethod.dll在哪里可以找到的啊?是你自己做的dll吗?

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我