【发布时间】:2010-09-07 03:55:59
【问题描述】:
由于运行时限制,我使用的是旧版本的 ASP.NET AJAX,在更新面板中放置 ASP.NET 验证器不起作用。有什么技巧可以让这些工作,还是我需要使用 AJAX 工具包附带的 ValidatorCallOut 控件?
【问题讨论】:
标签: asp.net asp.net-ajax updatepanel
由于运行时限制,我使用的是旧版本的 ASP.NET AJAX,在更新面板中放置 ASP.NET 验证器不起作用。有什么技巧可以让这些工作,还是我需要使用 AJAX 工具包附带的 ValidatorCallOut 控件?
【问题讨论】:
标签: asp.net asp.net-ajax updatepanel
我怀疑您正在运行 .NET 2.0 的原始版本 (RTM)。
在 2007 年初之前,验证器控件与 UpdatePanel 不兼容。 .NET Framework 的 SP1 解决了这个问题。
问题的根源在于 UpdatePanel 可以检测到您页面中的标记更改,但它无法正确跟踪脚本。验证器严重依赖脚本。在部分回发期间,脚本要么被吹走,要么没有更新,要么没有按预期运行。
在早期的测试版中,MS 让 UpdatePanel 尝试猜测哪些脚本需要重新渲染或运行。效果不太好,他们不得不把它拿出来。
为了解决当前的问题,Microsoft 在名为 Validators.DLL 的新 DLL 中发布了验证器类的修补版本,并提供了有关如何告诉 ASP.NET 使用这些类而不是真实类的说明。如果您用 Google 搜索该 DLL 名称,您应该会找到更多信息。另见This blog post。
这是一个权宜之计,你应该不要使用它 尽可能避免。
问题的真正解决方案在不久之后出现在 .NET 2.0 SP1 中。 Microsoft 在 SP1 中引入了一种新机制来注册脚本,并更改了真正的验证器类以使用该机制而不是旧机制。
让我给你一些关于变化的细节:
传统上,您应该通过 Page 方法注册脚本,例如 Page.RegisterStartupScript() 和 Page.RegisterClientScriptBlock()。问题是这些方法不是为可扩展性而设计的,UpdatePanel 无法监控这些调用。
在 SP1 中,页面上有一个名为 Page.ClientScripts 的新属性对象。该对象具有注册与原始脚本等效(并且在某些方面更好)的脚本的方法。此外,UpdatePanel 可以监视这些调用,以便在适当的时候重新呈现或调用方法。旧的 RegisterStartupScript() 等方法已被弃用。它们仍然有效,但不在 UpdatePanel 中。
没有理由(除了政治,我想)不将您的安装更新到 .NET 2.0 SP1。 Service Pack 包含重要的修复程序。
祝你好运。
【讨论】:
@Jonathan Holland:使用 Validators.dll 有什么问题?
由于它们替换了原始类,因此您正在悄悄地绕过 Microsoft 将来可能发布(或可能已经发布)的任何错误和安全修复、增强功能等。除非您仔细查看 web.config,否则您可能永远不会注意到您正在跳过补丁。
当然,您必须评估每种情况。如果您完全无法使用 .NET 2.0 RTM,那么 Validators.dll 总比没有好。
【讨论】:
@jmein
实际上的问题是 Validator 客户端脚本在放入 updatePanel 时不起作用(UpdatePanel 使用 .innerHTML 刷新,它将脚本节点添加为文本节点,而不是脚本节点,因此浏览器不会运行它们) .
修复是微软发布的修复此问题的补丁。我是在 Google 的帮助下找到的。
http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx
【讨论】:
如果由于某种原因您无法使用更新版本的 ASP.NET 验证器控件实际上很容易自己验证验证组,您只需调用
Page_ClientValidate("validationGroupName");
然后您可以根据需要使用 PageRequestManager 执行验证。
肯定使用更新的验证控件是可行的方法,但我非常偏爱 JavaScript ;)
【讨论】: