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,假如你的页面中没有一个
,则会失效。
问题回归到如体使用轻量级 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
<script runat="server"> <br /> public void IAjax() { <br /> int country_id; <br /> int.TryParse(Request.Form["country_id"], out country_id); <br /> Response.Write("["); <br /> List<CityInfo> citys = City.GetItemsByCountry_id(country_id); <br /> foreach (CityInfo city in citys) { <br /> Response.Write(string.Format("['{0}',{1},'{2}'],", city.Code, city.Id, city.Name); //这里我没有处理 js 问题,你自己处理 <br /> } <br /> Response.Write("]"); <br /> } <br /></script>
<script type="text/javascript"> <br />function getCitys() { <br /> var receive = function(rt) { <br /> alert(rt); <br /> }; <br /> var args = 'country_id=' + $('country_id').value; <br /> <%= Ajax.Register(this, "receive", "args") %> <br />} <br /></script>
这样一来,我们就轻松的将 ajax 部署到 UserControl/Page 中,不再依赖 asp.net 的不太好的东西。
分享到:
相关推荐
【转帖】用InstallShield进行ASP软件的打包和自动安装 - 项目脚本 - 中国软件打包技术论坛 installshield 1220082009中文教程wise打包install安装程序制作installshield - Powered by Discuz!.htm InstallShield 12 ...
论坛转帖工具 .......... 纯HTML
asp空间收心源码 易语言做都asp空间收信源码 欢迎下载转帖 \
程序的输出结果 博文链接:https://rednaxelafx.iteye.com/blog/187471
一键转帖 一键8经验签到. 绿易贴吧工具3.7 11.11版.rar
编辑人员转帖去水印工具,很好用,直接选中水印区域后运行伪装即可!
一页纸,刚看没有多少内容,也就半张纸的试题,可仔细看起来题目还挺多。有指针和引用的区别与联系,哪个更安全?为什么?类和结构体有什么联系和区别,相互之间能不能继承?还考了整型,指针,引用的sizeof。...
转帖性能测试
UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe
discuz X2转帖工具、采集工具,discuz论坛批量发帖,批量转帖工具
这是一个世界编程大赛第一名写的程序,很好玩的,大家试试看。
1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...
用于和我的转帖文章里的一个工具
转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...
Html2UBBMaxcj_Softii论坛专用转帖工具
gl8雨刮维修以及调试转帖.doc
转帖PLCDCSFCS三大控制系统的特点和差异.doc
最近在用Jsoup抓取某网站数据,可有些页面是ajax请求动态生成的,去群里问了一下,大神说模拟ajax请求即可。去网上搜索了一下,发现了这篇文章,拿过来先用着试试。转帖如下: 网上关于网络爬虫实现方式有很多种,...