2008-08-28 132 views
12

由于运行时限制,我正在使用较早版本的ASP.NET AJAX,因此在更新面板中放置ASP.NET验证器不起作用。是否有一个技巧可以使这些工作成功?还是我需要使用AJAX工具包附带的ValidatorCallOut控件?UpdatePanel中的ASP.NET验证器

回答

21

我怀疑你正在运行的.NET 2.0的原始发布(RTM)。

直到2007年初,验证器控件与UpdatePanels不兼容。这是用.NET Framework的SP1解决的。

问题的根源在于UpdatePanel可以检测页面中的标记更改,但无法正确跟踪脚本。验证器严重依赖于脚本。在部分回发期间,脚本要么被吹走,不能更新,要么在运行时不运行。

在早期的贝塔斯,MS有UpdatePanel尝试猜想什么脚本需要重新呈现或运行。它工作不太好,他们不得不把它拿出来。

为了解决当前的问题,Microsoft在一个名为Validators.DLL的新DLL中发布了校验器类的修补版本,并给出了如何告诉ASP.NET使用这些类而不是真实类的说明。如果你是Google的那个DLL名字,你应该找到更多的信息。另见This blog post

这是一个停止不前的措施,你应该 不使用它 如果可能的话避免它

问题的真正解决方案是在.NET 2.0 SP1之后不久。微软推出了一种在SP1中注册脚本的新机制,并将真正的验证器类改为使用该机制而不是旧版本。

让我给你上的变化的一些细节:

传统上,你应该通过页面的方法,如Page.RegisterStartupScript()和Page.RegisterClientScriptBlock()注册脚本。问题是这些方法不是为扩展性设计的,UpdatePanel无法监视这些调用。

在SP1中,页面上有一个名为Page.ClientScripts的新属性对象。这个对象有一些方法来注册与原来的脚本是等价的(在某些方面更好)。此外,UpdatePanel可以监视这些调用,以便它在适当的时候重新渲染或调用方法。较旧的RegisterStartupScript()等方法已被弃用。他们仍然工作,但不在UpdatePanel中。

没有理由(除了政治,我想)不更新您的安装到.NET 2.0 SP1。 Service Pack包含重要的修复程序。

祝你好运。

+0

谢谢!我的一台服务器显示了这种行为,实际上,它缺少sp1。 – edosoft 2008-11-02 19:40:30

2

@jmein

其实问题是,里面放置一个UpdatePanel时(UpdatePanel的刷新使用.innerHTML,这增加了脚本节点为文本节点,没有脚本节点验证客户端脚本的不工作,所以浏览器不会运行它们)。

此修复程序是由微软发布的修补此问题的修补程序。我在Google的帮助下找到了它。

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx

3

@Jonathan Holland:使用Validators.dll有什么问题?

由于它们会替换原始类,因此您正在悄悄绕过微软未来可能发布(或可能已经发布)的任何错误和安全修复程序,增强功能等。除非仔细看看web.config,否则您可能永远不会注意到您正在跳过修补程序。

当然,你必须评估每种情况。如果你绝对坚持使用.NET 2.0 RTM,那么Validators.dll总比没有好。

-1

如果什么都原因而无法使用ASP.NET验证控件的udpated版本其实很容易给自己验证验证组,所有你需要做的就是调用

Page_ClientValidate("validationGroupName"); 

然后您可以使用PageRequestManager根据需要执行验证。

明确使用更新的验证控件是要走的路,但我很偏向于JavaScript;)