ITPUB??ì3
ITPUB论坛 » Web开发 » ASP.NET与AJAX » asp.net Ajax 终极解决方案


标题: asp.net Ajax 终极解决方案
本帖已经被作者加入个人空间
离线 银河使者


精华贴数 0
个人空间 6855
技术积分 547 (3477)
社区积分 1 (44864)
注册日期 2008-2-8
论坛徽章:1
现任管理团队成员     
      

发表于 2008-5-1 18:00 
asp.net Ajax 终极解决方案

ajax 在目前 web 领域已广泛应用,其真正核心只不过是一个封装好了的 js 库。最五花八门的莫过于 asp.net 的控件,我个人认为 ajax 只是一个轻量级的东西,根本没有必要将它写成服务器组件,如 ajax.net、AjaxControlToolkit 等。所以我一直视这些组件为垃圾。。。

以下说明我为什么不认同 ajax 的相关组件:

1、将 ajax 封装得太死,出现问题难于调试;
2、组件过于臃肿,太多没有用的功能;
3、依赖性太强,少一样不可,如 webform;

传统的 ajax 应用到项目中,会出现由于项目的 ajax 应用太多,服务端的 ajax 响应函数难于管理,我们到底要把这些响应函数部署在什么位置?

假如
index.aspx 里有三个 ajax 响应函数,我们可以把这三个响应函数放在 index.aspx 中,并于 Page_Load 事件中根据参数不同来调用这些函数。
index.aspx 里还使用了 abc.ascx,这个控件里面也用到了 ajax,那么 abc.ascx 里的响应函数又应该放在哪里?index.aspx 中吗?如果 index2.aspx 中也用到了 abc.ascx,难道还要复制 index.aspx 的处理函数到 index2.aspx,这样肯定不行;
我们可以新建一个 ajax.aspx 来处理所有的 ajax 响应,php/asp 都可以这样做。这样管理还是不理想,
最理想的管理方法应该是页面、控件与响应函数集成。ICallBackEventHandler 可以做到,但是它依赖 webform,假如你的页面中没有一个 <form runat="server">,则会失效。
问题回归到如体使用轻量级 ajax,并实现页面/控件与 ajax 响应函数集成。

Reflector 查看 System.Web.UI.Page 里面处理 ICallBackEventHandler 模块后,我们可以这样做:

1、所有页面继承 BasePage;
2、BasePage 继承 System.Web.UI.Page,重写 BasePage.OnLoad;
3、实现 AjaxHandler
4、添加 Ajax 类,实现 Ajax.Register 静态方法

代码如下:
public class BasePage : Page {
    protected override void OnLoad(EventArgs e) {
        AjaxHandler();
        base.OnLoad(e);
    }

    ajax handler#region ajax handler
    //我喜欢用 json 格式数据来返回给客户端处理
    protected void AjaxHandler() {
        string ajax_target = Request.Form["ajax_target"];
        if (string.IsNullOrEmpty(ajax_target)) return;

        Control target = FindControl(ajax_target);
        if (target == null) return;

        MethodInfo method = target.GetType().GetMethod("IAjax");
        if (method == null) return;

        Response.Cache.SetNoStore();

        Response.Write("(");
        method.Invoke(target, null);
        Response.Write(")");
        Response.End();
    }
    #endregion
}

public class Ajax {
    public static string Register(Control control, string function, string argument) {
        if (control == null) return "//This control can not be NULL.";
        return string.Format("ajax({0},'{1}','ajax_target={2}{3},'post','{4}');", function, HttpContext.Current.Request.Url.PathAndQuery,
            HttpContext.Current.Server.UrlEncode(control.UniqueID), string.IsNullOrEmpty(argument) ? "'" : "&'+" + argument,
            HttpContext.Current.Response.Charset);
    }
}

我在 Page.OnLoad 前处理 ajax,通过 Request.Form["ajax_target"] 得到将要调用的目标,然后反射到目标的 IAjax 这个名字的函数(这里命名有问题,我随便命的),最后通过反射调用它并 Response.End
Ajax.Register 是注册一个 Ajax,和 ICallBackEventHandler 的使用方法一样,但不同的是现在不需要依赖 webform 和 asp.net 自带的 js库。它依赖传统的 ajax.js 库,并且通用 POST 自己传入参数
我没有写 ClientScript.RegisterClientScriptBlock 页面自动包含 ajax.js,有兴趣的可以自己改,到时你会遇到 ClientScript.RegisterClientScriptBlock 也依赖 webform,哈哈。。。你需要重新实现相应方法才可以,有兴趣可以直接询问我。

使用方法:abc.ascx
<%@ Control Language="C#" ClassName="abc" %>
<script runat="server">
    public void IAjax() {
        int country_id;
        int.TryParse(Request.Form["country_id"], out country_id);
        
        Response.Write("[");
        List<CityInfo> citys = City.GetItemsByCountry_id(country_id);
        foreach (CityInfo city in citys) {
            Response.Write(string.Format("['{0}',{1},'{2}'],", city.Code, city.Id, city.Name); //这里我没有处理 js 问题,你自己处理
        }
        Response.Write("]");
    }
</script>

<input type="text" id="country_id">
<input type="button" value="GO" onclick="getCitys()">
<script type="text/javascript">
function getCitys() {
    var receive = function(rt) {
        alert(rt);
    };
    var args = 'country_id=' + $('country_id').value;
    <%= Ajax.Register(this, "receive", "args") %>
}
</script>


这样一来,我们就轻松的将 ajax 部署到 UserControl/Page 中,不再依赖 asp.net 的不太好的东西。


只看该作者    顶部
离线 cnhzlt
好好学习


精华贴数 1
个人空间 2677
技术积分 3028 (490)
社区积分 27289 (39)
注册日期 2004-8-7
论坛徽章:184
2008北京奥运纪念徽章:羽毛球生肖徽章2007版:羊生肖徽章2007版:蛇生肖徽章2007版:蛇  
      

发表于 2008-5-1 20:31 
终极?


__________________
缺钱啊缺钱
只看该作者    顶部
离线 susanz
骨灰级长老


精华贴数 1
个人空间 0
技术积分 240 (7919)
社区积分 1857 (610)
注册日期 2002-11-12
论坛徽章:24
ITPUB元老春季摄影比赛纪念奖2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:足球2008北京奥运纪念徽章:排球2008北京奥运纪念徽章:马术
2008北京奥运纪念徽章:击剑2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:手球   

发表于 2008-5-1 20:46 
test


__________________
走在轮回路,一路要知足,用感谢心去付出,以欢喜心来受苦。
走在轮回路,一路要惜福,用大智慧去领悟,以大慈悲来祷祝。
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问