Anthem.NET 简介






4.76/5 (99投票s)
如何在不编写任何 JavaScript 的情况下实现 AJAX。
引言
AJAX 是许多 ASP.NET 开发人员感兴趣的技术,但市面上有许多 AJAX 库和解决方案——那么您应该选择哪一个呢?
我自己寻找时,使用的标准是:
- 支持 ASP.NET 2.0,因为我正在使用它,
- 尽可能无缝地与 VS2005 集成,理想情况下无需手动编写客户端 JavaScript,并且
- 尽可能紧密地支持 ASP.NET 功能。
在查看了各种 AJAX 库(包括 Atlas)之后,我注意到 ASP.NET 论坛正在使用一个我以前从未见过的库(它不是 Atlas!)。通过网络搜索,我找到了 Jason Diamond 的 MyAjax.net,它最近经过重新设计并在 SourceForge.Net 上以 Anthem.NET 的名义发布,因此它现在是一个官方的开源项目。还有一些讨论论坛。
注意:评论中有人指出我没有解决跨浏览器兼容性问题,这显然非常重要!我很高兴地报告 Anthem.NET 可以在 IE、FireFox 和 Safari 上运行(据我所知,它比 Atlas 好得多)。开发人员甚至投入了工作以确保它也能在 Mono 下运行。
只是另一个 AJAX 库?
那么,Anthem 只是另一个 AJAX 库吗?不,我甚至敢说 [戴上锡帽] 它是我在 ASP.NET 中见过的最好的一个。Anthem 用起来太简单了,简直是犯罪。它满足了我所有的标准(它支持 .NET 1.1 和 .NET 2.0),并且拥有许多内置的 AJAX 启用控件。它支持视图状态,因此您可以在回调中获取控件状态和页面信息。它与 Web 用户控件和母版页无缝协作;在实际应用程序中使用它后,我可以说它相当稳定。最重要的是,您无需编写任何 JavaScript(或 XMLscript)。
获取 Athem.Net
首先,您需要下载 Anthem.NET 1.0,您可以在主页此处找到相关链接。不幸的是,DLL 没有在快照中预编译,因此您需要提取项目并编译它们才能获得 DLL。
Anthem 有两个版本,一个用于 VS2003,一个用于 VS2005。您还会发现 Anthem 快照文件中包含一个演示网站,其中演示了各种控件及其使用方法。
在 VS2005 中使用 Anthem
假设您已经完成了这些并创建了 DLL,要在 Web 应用程序中安装 Anthem.NET,您只需将 DLL 作为引用添加到您的 Web 应用程序中即可。然后,您可以通过在工具箱中创建一个新选项卡,并使用右键菜单“选择项”来使 Anthem 控件可用——单击“浏览”并找到 Anthem DLL。
所有 Anthem 控件本质上都是 ASP.NET 控件的子类,因此您可以在网页上像使用普通 ASP 控件一样使用它们。通常,如果您不需要 AJAX 功能,最好使用普通的 ASP.NET 控件,因为它们不会有 HTML 开销。
一个简单的初次测试
在我们的第一个演示页面中,我们将使用 Default.aspx,它应该在您创建网站时已经为您创建。假设我们想在这个页面上有一个“登录”按钮,但我们不想重定向到另一个显示登录控件的页面,我们想取消隐藏一个登录控件,以便响应更快。如果使用传统的 ASP.NET 回发,整个页面必须重新加载才能使其可见。
要使用 Anthem 实现此目的,我们需要两个 Anthem 控件:一个 LinkButton
和一个 Panel
。将它们从您的 *Anthem* 工具箱中拖出。将 LinkButton1
的 'Text
' 属性设置为“Login”。现在,从 ASP.NET 的“登录”选项卡中拖动一个 ASP.NET 登录控件,并将其放置在 Panel1
中。如果需要,使用 Anthem Panel
控件是为非 Anthem 控件提供 AJAX 更新的最简单方法。将 Panel1
的 Visible
属性设置为 false
,以便它默认不可见。
现在是奇迹时刻!双击设计器上的 LinkButton
。您现在应该在代码编辑器中,其中有一个模板 LinkButton1_Click
函数。这不是回发,而是回调函数。
Anthem 将:
- 在客户端创建必要的 JavaScript,
- 将其绑定到控件的
OnClick
事件, - 在服务器上接收
XMLhttprequest
,并且 - 在您的服务器端代码中调用
LinkButton1_Click
。
不仅如此,您还加载了完整的视图状态、页面和控件状态。实际上,您可以完全像对待回发一样对待 Anthem 回调,只有一个例外:只有您指定的客户端控件会被更新。为此,您必须将 Anthem 控件的 UpdateAfterCallBack
属性设置为 'true
'。如果控件包含其他非 Anthem 控件(如我们的 Panel1
),则此控件将被更新。如果您总是希望它更新,您也可以在设计器中预先指定控件为 UpdateAfterCallback
=true
。
回到我们的演示——我们添加以下代码使 Panel1
可见,并在回调结果中更新它
protected void LinkButton1_Click(object sender, EventArgs e)
{
// toggle Panel1 visibility
this.Panel1.Visible = ! this.Panel1.Visible;
// tell Anthem to update this control
this.Panel1.UpdateAfterCallBack = true;
}
现在,尝试运行它。页面只显示登录链接。点击登录链接,回调被发送到服务器,服务器使 Panel1
可见,并返回更新后的 Panel1
控件。瞧,登录控件在没有回发的情况下出现了。看妈妈,没有 JavaScript!
为了显示我们有控件状态传回,让我们尝试另一个测试。回到设计器中,将一个普通的 ASP.NET TextBox
控件拖到网页上(放在 Panel1
下面即可)。我们将在登录控件可见时将其值复制到登录控件的 UserName
字段中,因此修改 LinkButton
代码如下
protected void LinkButton1_Click(object sender, EventArgs e)
{
// set username from textbox
this.Login1.UserName = this.TextBox1.Text;
// toggle Panel1 visibility
this.Panel1.Visible = ! this.Panel1.Visible;
// tell Anthem to update this control
this.Panel1.UpdateAfterCallBack = true;
}
这次运行代码时,在点击“登录”之前在文本框中输入一些文本。请注意,这会通过视图状态传回,并可用于我们的回调代码。
另一个改进:如果我们连接速度慢怎么办?用户可能会点击“登录”来获取页面,但一两秒的延迟可能会让他们认为什么都没有发生(特别是当服务器负载较高时)。他们可能会再次点击,导致登录控件闪烁。这类似于“提交订单”问题,您只希望用户点击“提交”按钮一次。Anthem 控件,如 LinkButton
和 Button
,有两个有用的属性:TextDuringCallBack
和 EnabledDuringCallBack
。如果我们将 EnabledDuringCallback
设置为 false
,则在回调处理期间按钮将被禁用。为了给用户一些反馈,您还可以设置 TextDuringCallBack
=Wait
,让他们知道正在发生一些事情。如果您在本地 IIS 上运行,它会非常快,您可能看不到,所以让我们添加一个延迟,使其更容易看到
protected void LinkButton1_Click(object sender, EventArgs e)
{
// simulate network delay with 2 sec delay
System.Threading.Thread.Sleep(2000);
// set username from textbox
this.Login1.UserName = this.TextBox1.Text;
// toggle Panel1 visibility
this.Panel1.Visible = ! this.Panel1.Visible;
// tell Anthem to update this control
this.Panel1.UpdateAfterCallBack = true;
}
结论
我希望这篇文章能引起您的兴趣。Anthem.NET 是微软本应编写的库,在研究 Atlas 后,我发现它过于复杂。它是一种向 ASP.NET 网站添加 AJAX 功能的如此简单的方法,我相信您会发现它和我一样有用!