轻松实现 ASP.NET 回调






4.31/5 (5投票s)
在用户控件中实现回调,选择客户端回调还是 Ajax 框架
引言
在本文中,我不会试图讨论“什么是 ASP.NET 回调”,并假设您已经对此有所了解。
我将提供关于如何使用它、如何使其易于使用,以及为什么我们应该使用回调而不是其他 Ajax 框架的信息,最后介绍如何将其制作成一个可重用的用户控件。如果您想深入了解回调,只需在网上搜索即可。您肯定会找到更多关于它的资源和文章。
开始使用回调并实现它既枯燥又耗时。而且,如果您不得不在项目中使用它,您的开发速度将会降低。那么解决方案是什么呢?我们如何才能避免回调的复杂性,同时又能轻松地使用它很棒的功能呢?答案是“创建一个用户控件,将其拖到页面上并使用其功能。”
本文正是回答了这个问题,并描述了使用回调的优势。
背景
几个月前,在我们公司为一个慈善机构工作项目时,我们遇到了一个问题。
该项目是将一个 DOS 应用程序重写到 Web 平台。但是,当安装了该项目的 Beta 版本后,他们报告说使用新应用程序非常耗时,而且用户至少需要插入两次日常记录。他们是对的,在缓慢的拨号连接下,页面回发让他们非常困惑。而 DOS 应用程序是基于键盘输入的,用户友好,并且不包含任何回发和服务器响应的等待时间。
因此,我们不得不对项目进行一些基本更改。我们不得不从大多数页面中删除回发,并将它们改为回调。但是正如我所说,在 ASP.NET 中实现回调在一定程度上是枯燥的,所以我们决定将其制作成一个用户控件。
在回调和经典 Ajax 或其他 Ajax 框架之间进行选择
在 Microsoft 在 ASP.NET 2 中引入回调之前,我们不得不使用经典 Ajax(即 XMLHttpRequest
或 Microsoft.XMLHTTP
)来制作异步页面。但现在,通过实现 IPotbackeventhandler
接口,我们可以向服务器发出异步调用,并从服务器渲染动态内容,而无需任何回发。
让我谈谈回调与经典 Ajax 的区别,并展示实现 IPostbackeventhandler
接口时会发生什么。
为了理解这一点,请遵循以下步骤
- 打开“\Temporary Internet Files”文件夹并删除其内容。
- 浏览一个已实现回调的简单网页(您可以使用我在源代码中包含的示例页面)。
- 现在,如果您回到“\Temporary Internet Files”文件夹,您会看到一个文本文件。
该文件包含一些处理 XMLHttpRequest
的 JavaScript 函数,所以看起来回调并不是一项新技术,它只是披着新衣的经典 Ajax。它的好处在于,开发人员可以更少地接触 JavaScript 代码,并且可以轻松地向服务器发出异步调用。
非常重要的决定
您的项目应该使用哪种技术?经典 Ajax、ASP.NET 回调还是 Microsoft Ajax 框架(update panel)?
正如我所说,经典 Ajax 和回调之间没有太大的区别。所以,让我们只比较回调和 Ajax 框架。
使用 Ajax 框架足够简单(您只需将一个 update panel 拖到您的页面上,即可使页面异步。update panel 中的每个控件都充当异步组件)。这可能就是您宁愿使用 Ajax 框架的原因。在一些流量不大的小型项目中,使用 Ajax 框架不是问题,但要小心,在某些情况下使用 Ajax 框架可能会损害您的应用程序性能。
有两个比较点
A. 客户端下载的文件大小
首先清理“Temporary Internet Files”。浏览网页时,其所有引用的文件(JavaScript 文件、CSS 文件、图片等)都会下载到此文件夹。)
创建两个简单的页面,一个只实现回调(您可以使用本文附带的文件),另一个使用 Ajax 框架。为此,只需将 script manager 和 update panel 拖到页面上。
浏览页面的结果
|
客户端下载的文件 |
文件大小(KB) |
sum |
回调 |
WebResource.axd?d=…….. |
32 |
32 |
Ajax 框架 |
ScriptResource.axd?d=…. |
304 |
402 |
ScriptResource.axd?d=…. |
77 |
||
WebResource.axd?d=…….. |
21 |
请注意,使用 Ajax 框架时,文件大小绰绰有余。
如果您带宽有限,或者您的项目是在慢速网络上使用,您应该使用回调,避免使用 Ajax 框架。
即使您只是简单地将 script manager 拖到页面上而不使用 update panel,所有上述文件都会包含在您的页面中,而 402 KB 并不是一个可以忽略的大小。
B. 到服务器的请求大小
使用 Web Test 计算的请求大小
1. 带 script manager 的页面

* 请求大小为:2,647
2. 带回调的页面

* 请求大小为:366
根据经验法则,最好使用回调而不是 Script manager。
Using the Code
首先将用户控件拖到您的页面上。
客户端只有一个函数(有 3 个参数)
asyncall(args,handlernumber ,receiverdivid)
参数
args
:任意数量的参数值,以“$$
”分隔handlernumber
:一个用于唯一标识每个函数调用的数字receiverdivid
:回调结果将显示的Div
对象的Id
示例
function btnSubmit_onclick() {
var param1, param2, param3;
param1 = document.getElementById('txtParam1').value;
param2 = document.getElementById('txtParam2').value;
param3 = document.getElementById('txtParam3').value;
asyncall(param1 + '$$' + param2 + '$$' + param3, 1, 'divResult');
}
function btnSubmit2_onclick() {
var param1, param2;
param1 = document.getElementById('txtParam1_Sample2').value;
param2 = document.getElementById('txtParam2_Sample2').value;
asyncall(param1 + '$$' + param2, 2, 'divResult2');
}
服务器端会发生什么
用户控件有一个事件,当调用 JavaScript 函数(asyncall
)时会触发该事件
Protected Sub CallBackHandler1_RaiseCustomCallback(ByVal eventArgs() As String,
ByVal HandlerNumber As Integer, ByRef CallBackResult As String,ByRef
ExcutableClientScript As String, ByVal RaiseException As System.Exception)
Handles CallBackHandler1.RaiseCustomCallback
让我们谈谈这个 sub
的参数
EventArgs()
:从客户端传递过来的参数数组HandlerNumber
:如果一个页面上的回调函数被使用多次,每个函数都应该使用HandlerNumber
参数来区分,这样当Sub
触发时,您就可以区分是哪个客户端函数被调用了CallBackResult
:您想在页面上显示的任何内容都应设置为此参数。此参数的内容将无回发地推送到页面上。内容可以是纯文本或 HTML 文本ExcutableClientScript
:您想在页面上执行的任何脚本都应设置为此参数。RaiseException
:异常
历史
- 2010 年 9 月 3 日:初始发布