另一个 AJAX 自定义 Web 控件






1.87/5 (9投票s)
2005 年 11 月 8 日
3分钟阅读

70351

356
一个用于使用 AJAX 的简单自定义 Web 控件。
引言
这是一个在 Web 表单中实现 AJAX 的自定义 Web 控件。现在我知道已经做了几次了,但我认为这些实现中的大多数都很难在生产代码中实现。例如,我不明白为什么 JavaScript 文件会在运行时添加到我的网站。我也不明白为什么我需要将属性添加到我打算从客户端调用的服务器端函数。我研究了 Atlas,虽然我确信这是进行 AJAX 的一种好方法,但我不喜欢我必须学习一堆脚本语法,并且我必须向 JavaScript 文件添加那么多链接。出于某种原因,我觉得这很乱。
我的解决方案
我的目标是创建一个控件,我可以将其放在多个程序集中的任何表单上。我还想尽量减少开发人员为了使用该控件而需要了解的内容。该控件应该能够调用 Web 服务和/或 Web Forms 程序集中的类,并使用与服务器端函数相同的函数签名。开发人员将按如下方式设置 Callback
和 WebServiceURL
属性
Jax1.Callback = "MyJaxTest.WebForm1"
Jax1.WebServiceURL = "https:///myJaxTest/Math.asmx"
我的解决方案是创建 JavaScript 函数来调用 Web 服务和 Jax 控件添加到的页面上的 public
类。
调用 Web 服务
调用 Web 服务是通过调用 Web 服务的 WSDL 来完成的。然后,我使用 XSL 将 WSDL 转换为更易于使用的东西。由此,我创建 JavaScript 来调用 Web 服务的每个函数。我最终会为异步调用创建函数存根,但此版本的控件不支持这些存根。开发人员需要做的就是使用相同的函数签名调用 Web 服务
function cmdWSTest_onclick()
{
alert(Multiply(2,3));
}
调用服务器类
调用 Web Forms 程序集中的类有点棘手。我使用反射为网页创建 JavaScript 存根。这意味着我无需将属性应用于函数签名。如果该方法是 public
,则会为其创建一个存根。其余的实现对于 AJAX 工具来说非常标准。您在 web.config 中创建 HTTPHandler
,以便当您的程序集看到带有 *.ashx 结尾的内容时,它会将其路由到处理程序。(请参阅本文)此控件与我见过的其他实现之间的最大区别在于,因为它位于 Web 站点之外的其他 DLL 中,所以处理程序必须引用 Web 站点的 DLL。我将其包含在 JavaScript 存根中的程序集引用中,以便在发布后我可以获取信息来调用程序集。到它进入生产代码时,我们可能会加密程序集路径。同样,开发人员只需像在服务器上一样调用该函数。
关于 AJAX
关于 AJAX 的说明,调用服务器端代码有很多前景。我们几年前就在 ASP 代码中做了这件事。ASP.NET 如此倾向于在服务器上做事,以至于它牺牲了用户体验来换取开发速度。AJAX 应用程序的真正挑战不是从服务器获取信息,因为此控件使这变得非常容易。真正的问题是如何在客户端上使用它。例如,您可以从 DataSet
中带回一堆 XML,但该 XML 的所有处理都在客户端上完成。这正是我们在 ASP 中所做的。我认为这在一定程度上缓解了 ASP.NET 带来的好处,因为我们正在通过后退来前进。我们将最终在 JavaScript 中做比过去更多的事情,或者比我认为 ASP.NET 认为我们要做的事情更多。