nicye

导航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

与我联系

常用链接

留言簿(1)

我参加的小组

我参与的团队

我的标签

随笔档案

相册

Friends

搜索

最新评论

阅读排行榜

评论排行榜

[推荐] 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
}


public class Ajax {
    
public static string Register(Control control, string function, string argument) {
        
if (control == nullreturn "//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 的不太好的东西。

ajax.js 代码:

Code
Tag标签: Ajax

posted on 2008-04-30 16:04 nicye 阅读(3264) 评论(83)  编辑 收藏

评论

#1楼  2008-04-30 16:14 韩现龙      

不要妄自菲薄,也不要妄自尊大。

也不要说什么什么是垃圾,它存在自有它存在的道理。   回复  引用  查看    

#2楼  2008-04-30 16:22 kkkk [未注册用户]

你的这个不垃圾吗?   回复  引用    

#3楼  2008-04-30 16:23 MarkZT      

要理解 你所说的垃圾 它们的出现是为了提高开发工作的开发效率.你能看到它的缺点,同样希望也能看到优点~   回复  引用  查看    

#4楼  2008-04-30 16:29 侯垒      

各有所长.   回复  引用  查看    

#5楼 [楼主] 2008-04-30 16:34 nicye      

@all
不好意思,果断了点。。
不过我所提到的我从来没有用过的!

至于我的这个垃不垃圾,又是一回事
如果你说 ICallBackEventHandler 是垃圾,那我的就是垃圾
  回复  引用  查看    

#6楼 [楼主] 2008-04-30 16:36 nicye      

@MarkZT
不明白 ajax 还需要怎样提高开发效率
你了解传统的 ajax 后,什么功能不能做?而你使用 ajax 组件来实现的功能必竟是有限的,而且这些组件不是标准

也就是说换了 php/asp,你所学的 ajax.net/ajaxpro 就没有用了   回复  引用  查看    

#7楼  2008-04-30 16:43 小No      

又是一个标题党   回复  引用  查看    

#8楼  2008-04-30 16:44 狼Robot      

如果楼主用的比较深入了说它垃圾,我可能会赞成,得楼主都没用过就说人家垃圾,这样是不对的.   回复  引用  查看    

#9楼  2008-04-30 16:50 爱在戏院前      

楼主写的其实是asp.net ajax终极解决方案,这样的话,确实算是比较好的,呵呵就是口气稍微的嚣张了一点点   回复  引用  查看    

#10楼 [楼主] 2008-04-30 16:52 nicye      

@狼Robot
我正在了解,未使用时就否定了它。所以不存在会使用它
我没有必要去花心思和时间在它上面
文章里说得清楚,ajax 只是轻量级的东西
如果对 js 比较熟练,就没有必要去用它   回复  引用  查看    

#11楼  2008-04-30 16:54 颜斌      

ICallBackEventHandler 每回调一次 就要走一个页面的完整的生命周期 会不会引来一些麻烦,或者性能上的问题?不知是否用映射到一个实现了IHttpHandler的类能好一些?

  回复  引用  查看    

#12楼 [楼主] 2008-04-30 16:55 nicye      

@爱在戏院前 and @all
我知道用 ajax.net 和 ajaxpro 的朋友太多,我们应该以学习的心态来交流,我口气嚣张是出自我的固执和执着。
希望大家能体谅!   回复  引用  查看    

#13楼  2008-04-30 16:57 AlanLau [未注册用户]

适合自己就好,
自己喜欢就好.   回复  引用    

#14楼  2008-04-30 17:00 Wenly      

很好,就是要狂点,就是要敢于狂   回复  引用  查看    

#15楼 [楼主] 2008-04-30 17:00 nicye      

@颜斌
这个问题有点难权衡,有时又偏偏需要走页面得到某些值。
我调试过,如果目标控件比较深,那么 asp.net 会一层层的 load 相关控件(而不是全部),所以在设计控件的时候需要自己来控制 IsPostBack 后处理

至于 .aspx 里的 Page_Load 则不会被执行,因为 AjaxHandler 处理在它之前

我文章里所走的流程和 ICallBackEventHandler 基本一样

整体来说,ICallBackEventHandler 不会有页面加载多余的问题   回复  引用  查看    

#16楼  2008-04-30 17:01 freesquare [未注册用户]

说起来也是的。。。现在MS搞的东西越来越大,越来不好用。。。把太多的功能一并打包在一起。
万事有好必然就有坏处啊。。。要灵活自动化就要损失,要太自动化必然损失灵活这个代价。。   回复  引用    

#17楼 [楼主] 2008-04-30 17:03 nicye      

@颜斌
谢谢提醒,可能考虑   回复  引用  查看    

#18楼  2008-04-30 17:09 A.Z! [未注册用户]

--引用--------------------------------------------------
nicye: @MarkZT
不明白 ajax 还需要怎样提高开发效率
你了解传统的 ajax 后,什么功能不能做?而你使用 ajax 组件来实现的功能必竟是有限的,而且这些组件不是标准

也就是说换了 php/asp,你所学的 ajax.net/ajaxpro 就没有用了
--------------------------------------------------------


为什么要换?
  回复  引用    

#19楼  2008-04-30 17:11 小寒      

项目功能的复杂程度,项目成员多javascript的了解程度,
项目的开发周期。。。等等
都是影响我们选用技术的因素

别人封装好的东西,肯定有局限性,但同时带来了易用性

自己去研究产生的东西,扩展性好,但要耗费时间和精力

不是每个老板都给我们时间和精力去深层次研究技术的

根据实际情况选择合适的东西,不要盲目否定自己认为不好的东西

存在就是道理!   回复  引用  查看    

#20楼  2008-04-30 17:15 SZW      

ASP.NET AJAX刚整合到.NET3.5的时候我也有过和楼主类似的想法(不过还没到“垃圾”这个境界)。我是觉得存在总有他的用意,不喜欢不用就是了。后来再仔细想想,发现或许整合了之后的ASP.NET AJAX(且不考虑它的具体实现方法和功能,很多地方做的确实还不尽如人意)才是延续和完善WebForms思想以及一惯做法(尤其是Forms体验)的“准终极解决方案”。   回复  引用  查看    

#21楼 [楼主] 2008-04-30 17:20 nicye      

@A.Z!
我的意思是 ajax 不是 .net 独有的
会 js + 任何一种 web 服务端语言 的人就会 ajax
ajax 太简单了,复杂的也只是 js 的问题   回复  引用  查看    

#22楼 [楼主] 2008-04-30 17:24 nicye      

@小寒
大局观上我也同感
使用哪种 ajax 的技术并不会决定一个项目的成败
ajax 太小了   回复  引用  查看    

#23楼 [楼主] 2008-04-30 17:26 nicye      

@SZW
哈哈,谢谢提醒,以后注意用词   回复  引用  查看    

#24楼  2008-04-30 17:30 韩现龙      

--引用--------------------------------------------------
nicye: @小寒
大局观上我也同感
使用哪种 ajax 的技术并不会决定一个项目的成败
ajax 太小了
--------------------------------------------------------

……ajax莫非还分不同的门派?   回复  引用  查看    

#25楼 [楼主] 2008-04-30 17:43 nicye      

@韩现龙
ajax 组件,了解它,一个星期,使用它遇到问题,调试死人
纯 js,查看返回数据是否正确就可以调试

ajax 太小了,没有必要精力死搞在它上面,好用即可   回复  引用  查看    

#26楼  2008-04-30 20:33 Clingingboy      

楼主太偏激,楼主应该好好看看ajaxpro,ajax很小,但现实问题很多,等你ajax操作多了你便知道出现问题了。
楼主上边的封装还是一个想法的模型,但不太完善。
建议看下script#的封装。

你的到终极方案还很远   回复  引用  查看    

#27楼  2008-04-30 20:49 今日事 [未注册用户]

ICallBackEventHandler ,其实就是post的执行过程,仍然会执行整个页面执行过程。
所以,叫做ajax UI效果的应用,更合适。   回复  引用    

#28楼  2008-04-30 20:50 今日事 [未注册用户]

ajaxpro还是有其价值的   回复  引用    

#29楼 [楼主] 2008-04-30 20:50 nicye      

@Clingingboy
对,我这里讲的 ajax 部署及不依赖 webform 等现实,有关如何连动/分页等功能,我觉得还是直接交给使用者来现实
你可能把此文错误的理解成了 ajax 的另一个组件
  回复  引用  查看    

#30楼 [楼主] 2008-04-30 20:56 nicye      

@今日事

--引用--------------------------------------------------
今日事: ICallBackEventHandler ,其实就是post的执行过程,仍然会执行整个页面执行过程。
所以,叫做ajax UI效果的应用,更合适。
--------------------------------------------------------
嗯,它依赖性 asp.net 自带的 js 库,而这个 js 库靠 ClientScript 来注入到页面,而 ClientScript 又要依赖 WebForm,我这里就是解决这些文章

--引用--------------------------------------------------
今日事: ajaxpro还是有其价值的
--------------------------------------------------------
这个看技术领导者的决策,是否应用 ajaxpro,不过我还是认为,去了解它几十个组件的时间已经足够把 js 了解透,会 js 的人基本就会 ajax,但会 ajaxpro 的人并不一定对 js 得很清楚

js 也好,ajax 也好,它们在项目里充当的只是个小小的角色   回复  引用  查看    

#31楼  2008-04-30 21:31 今日事 [未注册用户]

ajaxpro 的价值与领导者的决策没有因果关系,也不会成为判断的标准。

懂webform的人,不一定就看过他的源代码。但是,这丝毫不会影响他的价值。作为对底层的封装,本身就已经成为了一种价值。

如果曾经有心研究过ajaxpro,对其优良的设计,优秀的思路,有所感悟的话,相信会对后来者有所启发。如果有一天,我们能够比他走的更远,请不要忘记,我们曾经站在他的肩上。对前人的成果表示出真心的尊敬,这是我们的需要培养的素质。   回复  引用    

#32楼  2008-04-30 21:46 曾经年少爱轻狂 [未注册用户]

忍不住冒个泡,楼主可曾阅读过相关js库的源代码?

ICallBackEventHandler本身就算不上是健全的ajax的应用,他是个伪装的post过程。

倒是 ajaxpro 在理念和实现上都比ICallBackEventHandler先进和健全。

哎,曾经年少爱轻狂啊!   回复  引用    

#33楼 [楼主] 2008-04-30 21:51 nicye      

@今日事
我没有用过它。
在所有依赖 webform 的控件中,我只常用 gridview ,用它的做后台管理功能。
ajaxpro 很有价值,因为它有很多粉丝(不包括我)。
对于从其它 web 语言转来 asp.net 的朋友,我想应该会一些对 asp.net ajax 应用都有些迷惑,他们找不到更好的解决方法。另一方面,在 ajax.net 大力宣传下,他们去学习并应用 ajax.net。
我喜欢纯 js 的 ajax 应用。

楼上有位朋友说 “等你ajax操作多了你便知道出现问题了”
js 的 ajax 操作多了就会有问题吗?这话很容易就推翻。
1、做 php 的朋友没有 ajaxpro 或一些组件,他们怎么用 ajax 的呢?
2、ajaxpro 能更好的管理 ajax 吗?有什么说服力?   回复  引用  查看    

#34楼  2008-04-30 21:55 tthxnz [未注册用户]

说实话,我也喜欢callback,自从用了vs2008的ajax.net,页面平白无故的多出一个100来k的scriptresource.axd,页面速度之慢非常恼火   回复  引用    

#35楼 [楼主] 2008-04-30 22:01 nicye      

@曾经年少爱轻狂
哈哈,有可能我记错了是 AjaxControlToolkit.dll,这组件极度恶心

--引用--------------------------------------------------
颜斌: ICallBackEventHandler 每回调一次 就要走一个页面的完整的生命周期 会不会引来一些麻烦,或者性能上的问题?不知是否用映射到一个实现了IHttpHandler的类能好一些?
--------------------------------------------------------

看一下实现的源码   回复  引用  查看    

#36楼 [楼主] 2008-04-30 22:02 nicye      

@tthxnz
但 callback 离不开 webform,也就是说你页面没有 <form runat="server">,你将不能使用它
我写这篇文章主要是解决这个问题   回复  引用  查看    

#37楼  2008-04-30 22:08 PPPP [未注册用户]

观点支持,楼主说话刺痛好多人神经了,呵呵。
俺有强迫症,见不得ASP.NET WEBFORM胡乱搞俺的HTML,早就MVC了,呵呵,早就终极方案了   回复  引用    

#38楼  2008-04-30 22:20 路过 [未注册用户]

终极?
哈哈   回复  引用    

#39楼  2008-04-30 23:12 Jeffrey Zhao      

说句实话,我觉得ASP.NET里最没用的功能其实感觉就是ICallbackEventHandler了,不伦不类,调一个接口却要跑整个界面。远不如ASP.NET AJAX。
说到底你可能是不喜欢ASP.NET WebForms + UpdatePanel,但是你可以不用,只用web service调用,比ICallbackEventHandler好很多。而且调用Web Service也完全可以不用ASP.NET AJAX的客户端框架。   回复  引用  查看    

#40楼  2008-04-30 23:13 Jeffrey Zhao      

还是那句话,你不了解的东西,没有理由说它垃圾。   回复  引用  查看    

#41楼  2008-05-01 01:06 隐姓埋名1 [未注册用户]

晕`这么多高人的!
看起来 好复杂啊!   回复  引用    

#42楼  2008-05-01 02:18 Cat Chen      

我觉得,在你的理解中AJAX就是XHR调用。但实际上,AJAX是一套交互方式,你把所有客户端DOM的操作都剥离后,这就是纯粹的XHR。你当然可以说这很轻量级,但是意义不大。   回复  引用  查看    

#43楼  2008-05-01 02:20 Cat Chen      

另外,你用ASP.NET AJAX作为标题是有歧义性的,因为ASP.NET AJAX本身就是一个框架的名字,而不是指一般针对ASP.NET的AJAX库。

我认为,在你对各种AJAX库有相当了解之前,没必要太早下定论。   回复  引用  查看    

#44楼  2008-05-01 02:21 Cat Chen      

如果你讨厌WebForm,那么可以考虑直接写针对ASP.NET底层框架的Ajax库,或者针对ASP.NET MVC的,而不是继续在Page上做。   回复  引用  查看    

#45楼 [楼主] 2008-05-01 04:19 nicye     &nbs