asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

跳出封装剖析ASP.NET脚本回调的原理


发布日期:2024年07月08日
 
跳出封装剖析ASP.NET脚本回调的原理
[注此段与标题内容无关可略过] 在看完两集Stargate并且洗了一个澡之后我终于决定要开始写这篇文章这是我第一篇真正意义上的原创技术文章不管技术含量如何我总算是迈出了这一步博客其实开过不少从最早的校园大巴到博客园以及我那个用来发牢骚的新浪博客其实开博客最初的目的就是用来在写程序的同时记录一下自己的学习的过程但是后来演变成了用来发牢骚的东西这也算是我一直以来不能专心钻研的恶果吧不过所谓亡羊补牢为时未晚就从这篇文章开始变得专注一点再专注一点由这种专注的思想引导我最近终于又开始好好的写程序这次是真的放下了那些不想干的东西专心致志的开始写我喜欢的C#代码在我所知道的编程语言里面我最喜欢的是C#和javascript后者是种脚本语言准确地说j是我最近才喜欢上的我原来以为它也就同我小时候玩的Basic一般小巧也简单但是事实证明不是这个样子的虽然它和VBS一样也是脚本语言但是在它C语言的外表之下其实隐藏着更多的内容这个我可能会写另外的一篇文章来描述它现在切入正题我喜欢的NET平台不知道为什么年的时候第一次使用C#语言写代码就觉得它很漂亮然后就爱上了他不过那个时候由于环境的问题所以一度中断一直到了才又重新拾起来但是一年多的时候我也只是在拉着一堆堆的控件然后在属性面板里调整啊调整似乎忘记了Web原来有的样子是怎么样的后来终于有一样东西换起了我的回忆 Ajax

到处都是Ajax开发框架其实在ASPNET 发布的时候内部其实就整合了一些类似的内容在一些数据控件比如GridView上面就有使用年一月份的MSDN Magazine中的一篇《Custom Script Callback in ASPNET》(中文版 | English)让我认识到了 里面异步调用的魅力(里面的实现方法仅限于在beta版本中实现关于脚本回调部分betabeta以及正式版本之间都有所不同有兴趣者可以自己参见最近发布的MSDN内容)不过当时也只是玩了一下后来使用Atlas也就对它没怎么上心不过前一段时间一个朋友和我讨论实现ajax时讲到atlas实现太过于繁琐而他要实现的只是几个非常小的内容不需要那么麻烦由于我对除了这些之外的NET的ajax框架不熟悉所以自然而然的就想起了内置的脚本回调机制利用(经过他本人同意的)朋友的项目我们编写了很多关于这个的代码在写完之后我突然发现了一个问题就是代码太乱了每个页面都是类似的东西而且只能传递一个字符串参数让我们在除了交互方面对于一些大开销的数据展示只好使用内嵌框架来实现了前两天到海图买了一本《Ajax 高级语言程序设计》看了一部分之后突然想搞明白 里面的脚本回调又是如果实现的?其实现在转回来头看《Custom Script Callback in ASPNET》一文中很多地方已经讲的很明白了可以无奈当时的水平很多东西看的都是云里雾里的光顾者看效果了先贴一个我认为最简洁的实现效果然后再进行剖析

新建一个Defaultaspx的页面在页面上添加一个CheckBox控件然后打开Defaultaspxcs文件_Default类添加三个继承的接口ICallbackContainerICallbackEventHandler和INamingContainer

[代码]

#region ICallbackContainer 成员

public string GetCallbackScript(IButtonControl buttonControl string argument)

{

throw new Exception(The method or operation is not implemented);

}

#endregion

#region ICallbackEventHandler 成员

string temp;

public string GetCallbackResult()

{

//throw new Exception(Sample Error);

return temp;

}

public void RaiseCallbackEvent(string eventArgument)

{

temp = _____ + eventArgument + is succeed_____;

}

#endregion

转到Defaultaspxcs页面的Page_Load方法中加入下面代码

[代码]

proected void Page_Load(object sender EventArgs e)

{

string temp = PageClientScriptGetCallbackEventReference(this arg Callback context OnError true);

string script = function CallServer(argcontext){ + temp + };

PageClientScriptRegisterClientScriptBlock(thisGetType() abc script true);

CheckBoxAttributesAdd(onclick CallServer(I call Server context););

}

在编辑完CS代码之后打开Defaultaspx文件在<head></head>之间加入下列代码

[代码]

<script type=text/javascript>

function OnError(errcontext)

{

alert(err);

}

function Callback(argcontext)

{

alert(arg);

}

</script>

这里的CheckBox控件是随便拉上去的有需要可以随便更改不过用Button控件的时候可能要注意一下它默认就会激活OnSubmit事件所以可能要设置或是直接使用HTML控件就好了以上的代码算是脚本回调最小化的实现都是必须的缺一不可

使用基本回调的控件必须实现三个接口分别是ICallbackContainerINamingContainer和ICallbackEventHandler其实INamingContainer没有需要实现的接口内容它只是标识在 Page 对象的控件层次结构内创建新 ID 命名空间的容器控件(引自MSDN)至于ICallbackContainer这个接口在MSDN(中文版本)里面给出的解释比较模糊相关联的一些文章也都是介绍脚本回调和ICallbackEventHandler接口的因为我们这里是用页面作为回调的基础所以没有使用这个接口要实现的方法GetCallbackScript但是如果是封装自己的Ajax控件那这个方法就十分有用了这里我们只是用了ICallbackEventHandler实现的方法来处理数据因为在Page_Load方法中我注册了一个CallServer的方法然后依附于CheckBox的OnClick事件上触发这样我们就可以看法一个比较清晰的调用过程了

后面[代码]我实现了两个Javascript方法一个是用来处理调用出错的另外一个就是用来处理调用成功之后处理返回信息的了在[代码]里面有一段抛出异常的代码被我注释掉了通过这句代码就可以模拟调用OnError方法了

一直到这里我们都是看到的实现这个调用是怎么样的说白了这其实算是一种比价高级的拖控件的方式但是它到底是怎么实现的呢?为什么我没有看到任何有关于XmlHttpRequest的内容呢?(我坚信这是实现Ajax最好的方法因为这段代码在任何支持Javascript浏览器上都可以使用我想应该不会和暗门有关系吧)               

上一篇:ASP.NET页面打印技术的总结

下一篇:ASP.NET中的HTTP模块和处理程序(下)