由于运行时限制,我正在使用旧版本的 ASP.NET AJAX,将 ASP.NET 验证器放置在更新面板内不起作用。有没有什么技巧可以让这些工作,或者我是否需要使用 AJAX 工具包附带的 ValidatorCallOut 控件?

有帮助吗?

解决方案

我怀疑您正在运行 .NET 2.0 的原始版本 (RTM)。

直到 2007 年初,验证器控件仍与 UpdatePanel 不兼容。.NET Framework 的 SP1 解决了这个问题。

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

在早期测试版中,微软让 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。服务包包含重要修复。

祝你好运。

其他提示

@乔纳森·霍兰德:使用 Validators.dll 有什么问题?

由于它们取代了原始类,因此您可以悄悄地绕过任何错误和安全修复、增强等。Microsoft 可能在未来发布(或可能已经发布)。除非您仔细查看 web.config,否则您可能永远不会注意到您正在跳过补丁。

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

@jmein

实际上,问题在于验证器客户端脚本在放置在 updatePanel 内部时不起作用(UpdatePanel 使用 .innerHTML 刷新,它将脚本节点添加为文本节点,而不是脚本节点,因此浏览器不会运行它们)。

微软发布的补丁修复了这个问题。我在谷歌的帮助下找到了它。

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

如果出于某种原因您无法使用 ASP.NET 验证器控件的更新版本,实际上您自己验证验证组非常容易,您所需要做的就是调用

Page_ClientValidate("validationGroupName");

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

使用更新的验证控件无疑是正确的方法,但我非常偏爱 JavaScript ;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top