魔力AJAX:在现有的网页中使用AJAX

本文介绍了一种名为AjaxPanel的控制面板,用于简化AJAX技术的应用开发过程。通过四个简单步骤,开发者可以轻松地将传统的ASP.NET控件转换为具备AJAX功能的控件,从而实现在不刷新整个页面的情况下更新页面部分内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



介绍:
关于AJAX技术的吹嘘到处都有,这里有许多AJAX解决方案可供开发者选择。缺点是你必须把包含AJAX控制的页面重置标准化ASP.NET控制,或编写客户端的JavaScript代码,用来处理从服务器返回的数据。
如果有个控制面板,将传统的拖放,老式的ASP.NET控制,转化为AJAX式的控制会怎样?不可能?好,这里将介绍这样一种控制面板可以这样(AjaxPanel),也没什么神奇的,而且是用C#写的。
2005年十一月更新:MagicAjax框架在SourceForge有共享。最新版添加了很多改进和特征,包括支持ASP.NET 2.0,访问MagicAjax的主页可以得到一些相关信息,并可以下载最新版。
背景:
这里是假设你知道Ajax是什么。如果不是,仍然有许多好文章帮助你了解Ajax。下面的代码是在Bill Pierce关于AJAX的文章中找到的。不懂JavaScript客户端框架和如何调用服务器方法也不会影响你使用下面的这个类,如果你想知道它是怎么工作的,建议读一下Bill Pierce的文章。

使用该代码:
这里有一个演示,是关于如何将现有的一般后台操作转化为AJAX模式。
BubisChat.aspx
是一个类似聊天程序的页面。我不会详细介绍它是怎么工作的。只是为了演示的目的建立了它。它用了标准的ASP.NET控制方式,这没什么神秘的。由按钮触发一个postback到服务端,然后页面刷新并显示控制新的数据界面。
AjaxBubisChat.aspx
该页面使用了相同的控制,但有很大的不同,控制被迅速刷新但没有浏览器的刷新操作出现。这就是AJAX的作用。
那,你究竟做了什么了呢?
这里有四步用来将BubisChat.aspx转变为 AjaxBubisChat.aspx(或在其它框架里使用 Ajax):
让页面继承AjaxPage(可选)
public class AjaxBubisChat : Ajax.AjaxPage
继承不是必须的;它只是回调事件并提供一些方便有用的参数。在继承于AjaxPage的页面里处理回调事件,你要改写OnCallBack方法
protected override void OnCallBack(EventArgs e)
{
    // Refreshes the sessionID in the cache
    PutSessionIDInCache();

    txtMsg.Text = chatData.msgText.ToString();
    ShowNames();

    base.OnCallBack (e);
}


如果页面不是从AjaxPage继承,将用ICallBackEventHandler执行回调
public interface ICallBackEventHandler
{
    void RaiseCallBackEvent();
}


回调函数很象postback但是不会引起浏览器的刷新。我会解释回调做了哪些。一会你就会明白,页面调用事件及控制在回调期间不会被处理。而且你必须使用回调来实现这种操作。
在回调中该页HttpContext标记是非法的。所以你不能用System.Web.UI.Page的Request/Response参数,你必须用CallBackHelper.Request 和 CallBackHelper.Response参数。AjaxPage页面提供了合法的Request/Response参数,你不必因为CallBackHelper重新设置。
将一个AjaxPanel控制加入,就可以不做postback而刷新页面了。
作为一个AjaxPanel其中有TextBox 和 ListBox,AjaxPanel是由这些组成的。按钮可以在提交时调用回调函数。这里为了方便将所有功能作在一个AjaxPanel里。
配置web.config文件:
<httpModules>
    <add name="AjaxHttpModule" type="Ajax.AjaxHttpModule, Ajax" />
</httpModules>

at the <system.web> section, and:
在<system.web>段里:

<!-- If CallBackScriptPath is not set in the appSettings,
                                 "/ajax/script" is used-->
<add key="CallBackScriptPath" value="/ajax/script" />


在 <appSettings>段里:

AjaxHttpModule处理HttpApplication中AcquireRequestState事件回调。在请求通过认证后。默认的脚本路径是必要的,该资源在wwwroot路径下。如果放到其他路径,你要改变程序的CallBackScriptPath设置。
将页面的CallBackTimer设为有效(可选)
//设置自动回调每3秒。
CallBackHelper.SetCallBackTimerInterval(3000);
这样textbox就会自动刷新了。许多页面不需要自动刷新,这里可以忽略这些。
你也许不相信,没有JavaScript和控制复位是必须的。你可以添加新控制到AjaxPanel。

那回调函数到底是做什么的呢?
回调函数的工作是调用服务端的控制事件(如果可以还调用一个CallBackTimer事件)。想了解更多,可以看看Bill Pierce的文章的背景部分。当服务端得到一个 回调,它返回普通的JavaScript代码。客户端并不关心这段代码做什么(如显示下拉列表,引用提示框,或其它),客户段只是执行这段代码。因此,AJAX程序的特殊操作是用服务端来操作网页显示。不是客户端。这种方式有别于将JavaScript写在网页里并和服务器代码保持同步的方式,其目的是将所有用户的控制功能转移的服务端,而且不必把代码分成JavaScript部分和C#(VB.NET,或其它)部分。
现在,有一件有趣的事。一个AJAX网页被保存为一个session状态变量。当一个回调发生后,AjaxHttpModule截获它,发现发出请求的session页面,并为控制引用适当的事件,并且不用每次一个按钮按下时再次调用,并且控制可以添加并动态删除。如果你将一些按钮添加到页面,它们也会在浏览器里显示出来。为了将一个页面保存到session里,必须至少要包含一个AjaxControl的控制(AjaxPanel的基类)。session关键字是原始页面的URL,所以不同的页面可以被区分开。
回调不必从AjaxPanel包含的控制发出,可以由页面控制引用,为了可以适当调用回调函数,可以这样定义:

CallBackHelper.GetCallbackEventReference方法是在客户端提供了AJAXCbo.DoPostCallBack调用,返回false;被添加后可以重写submit函数。
AjaxPanel默认自动定义所有submit按钮,包含调用回调函数并用AJAXCbo.DoPostCallBack调用重置postback通常的__doPostBack调用。如果你想手动设置OnClick事件,将SetCallBackForSubmitButtons和SetCallBackForChildPostBack参数设置为false。
AjaxPanel的秘密:
AjaxPanel的任务是在客户端浏览器上更新每一个回调引用。为了完成这些,它要检测所包含的当每个JavaScript控制代码添加,移除和改变后发生的控制,忽略没有发生任何改变的控制。为了发现有什么改变,它刷新每个控制并检测生成的HTML和先前回调中产生的代码有什么不同。
另外,如果AjaxPanel遇到任何RenderedByScriptControl控制(AjaxPanel从该类继承),它将忽略并使其检测浏览器的"reflection"。所以如果一个AjaxPanel(父级)包含另一个AjaxPanel(子级),并有一个子级的AjaxPanel控制改变,父级AjaxPanel将不发送所有子级AjaxPanelHTML刷新,并且子级AjaxPanel将发送HTML改变的控制。这样客户端作为回调的JavaScript代码的大小将大副减少。

局限性:
已知的局限性是:
你不能移除一个AjaxPanel控制的属性。移除不会反映到页面上。使用:ajaxPanel.Attributes["attrib"] = "";
AjaxPanel内部包含的控制中没有引用客户端默认的确认页面。你必须手动插入适当的OnClick控制事件的JavaScript。
只能在IE和FireFox中调试。如果浏览器不支持XmlHttp则毫无选择。
Session必须在"InProc"模式下。"SQLServer"和"StateServer"模式不被支持。
我不会给出类的内部工作的的介绍。但会将每种方法写成文档。所以任何人想要扩展AJAX控制,我建议看一下所有类和方法的注释。只是使用该框架的可以:
演示页面的script路径只在将资源文件安装到wwwroot路径下才是合法的,如果你安装到其它路径,你需要改变web.config中的程序的CallBackScriptPath 设置。
以下四步是使用该代码段的方法:
阅读AjaxPage.cs, CallBackHelper.cs 和 ICallBackEventHandler.cs的注释
阅读AjaxPanel公共参数的注释
阅读AjaxLinkButton控制的注释
你可以使用CallBackHelper.Write发送客户的JavaScript到客户端。
你必须用页面中的CallBackHelper.Request和CallBackHelper.Response参数,除非它从AjaxPage继承。用户控制和AjaxUserControl是等价的。
不要用AjaxPanel内部的控制,因为仅仅一个对象变化,所有的对象都必须在客户端刷新。
23-9-2005升级后,framework 可以在回调时处理Response.Redirect和Server.Transfer方法。你不必改动它们。
在一个回调中用CallBackHelper.End而不用Response.End
在观念中保持回调和postback是不一样的,因为页面控制是由session支持的。因而调用事件并不明显。而且你可以从AjaxPanel动态添加/删除控制,这种改变可以反映到页面上。有点象操作一个桌面程序。
重要的几点:
AjaxPanel将"Browser Back Button"问题处理的很好,"Browser Back Button"问题是按动后台按钮时,浏览器从缓存里调用HTML页面,所以任何页面的AJAX变化将消失,这通常是在用户仍然希望浏览先前看过的相同页面时发生的。

为了解决这个问题,我在页面中添加了一个JavaScript函数,可以在页面调用时执行并隐藏空白区域。函数将检测空白区,如果空白,将允许页面被服务器的一个请求调用(IE刷新),在区域中设定值。如果函数发现区域不是空白的,将允许浏览器后台按钮调用页面(区域中的值将被重置),然后引用一个特殊的服务户端回调函数(CallBackStartup)。当CallBackStartup事件发生后, AjaxPanel刷新所有客户端页面对象,重置先前页面。
结论:
我希望你找到该框架。我希望你能对此精通,如果发现有些奇怪的,吃惊的,瞪眼的,惊异的控制方式,请和我一起分享。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值