UpdatePanel中的ASP.NET验证器
由于运行时限制,我使用的是ASP.NET AJAX的较旧版本,在更新面板中放置ASP.NET验证程序无效。有什么技巧可以使这些工作正常进行,还是我需要使用AJAX工具包随附的ValidatorCallOut控件?
解决方案
回答
@jmein
实际上,问题在于,将Validator客户端脚本放置在updatePanel内部时不起作用(UpdatePanels使用.innerHTML刷新,这会将脚本节点添加为文本节点,而不是脚本节点,因此浏览器不会运行它们)。
该修补程序是由Microsoft发布的修补程序,用于修复此问题。我在Google的帮助下找到了它。
http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx
回答
我怀疑我们正在运行.NET 2.0的原始版本(RTM)。
直到2007年初,验证器控件才与UpdatePanels兼容。 .NET Framework的SP1已解决此问题。
问题的根源是UpdatePanel可以检测页面中的标记更改,但是无法正确跟踪脚本。验证器严重依赖脚本。在部分回发期间,脚本或者被吹散,未更新,或者在有意时不运行。
在早期的Beta中,MS让UpdatePanel尝试猜测需要重新渲染或者运行哪些脚本。效果不是很好,他们不得不将其取出。
为了解决当前的问题,Microsoft在名为Validators.DLL的新DLL中发布了验证器类的修补版本,并提供了有关如何告诉ASP.NET使用那些类而不是实际类的说明。如果我们使用Google提供该DLL名称,则应该找到更多信息。另请参阅此博客文章。
这是一种制止措施,应尽可能避免使用它。
不久之后,.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: What is wrong with using Validators.dll?
由于它们替换了原始类,因此我们将悄悄地绕过Microsoft将来可能发布(或者可能已经发布)的任何错误和安全修复,增强功能等。除非我们仔细查看web.config,否则我们可能永远不会注意到自己正在跳过补丁。
当然,我们必须评估每种情况。如果我们绝对无法使用.NET 2.0 RTM,那么Validators.dll总比没有好。
回答
如果出于某种原因我们无法使用ASP.NET验证程序控件的更新版本实际上非常容易自己验证一个验证组,那么我们所需要做的就是调用
Page_ClientValidate("validationGroupName");
然后,我们可以根据需要使用PageRequestManager执行验证。
一定要使用更新的验证控件,但是我相当偏爱JavaScript;)