【问题标题】:Is there a way to get a ValidationSummary to work with client-side validators?有没有办法让 ValidationSummary 与客户端验证器一起工作?
【发布时间】:2026-02-14 00:05:01
【问题描述】:

.NET ValidationSummary 控件聚合来自在回发时触发的验证器的错误消息。有没有办法让它也显示来自客户端验证器的错误消息?

我正在处理的问题是,在长页面上,可以单击提交按钮,使某些客户端验证器失败,但从未看到错误消息。我想在按钮附近有一个验证摘要,这样用户就永远不会没有反馈。

我希望任何具有客户端验证的标准 .NET 验证器都反映在验证摘要中,但我最关心的是让 RequiredFieldValidators 工作。

我可以破解它,以便在单击按钮时会在短暂延迟后自动显示一条一般消息,告诉用户检查页面上的错误。这适用于没有发生回发的情况,但会很丑。

以下是一些不适合我的示例代码:

<asp:LinkButton ID="btnOpen" runat="server" ToolTip="Open" ValidationGroup="Create" CausesValidation="true" />
<asp:TextBox ID="txtBlah" runat="server" />
<asp:RequiredFieldValidator ID="reqBlah" runat="server" ControlToValidate="txtBlah" EnableClientScript="true" Display="Dynamic" ErrorMessage="Enter some blah" ValidationGroup="Create" />
<asp:ValidationSummary ID="summary" runat="server" EnableClientScript="true" DisplayMode="BulletList" HeaderText="Errors:" ShowMessageBox="true" ShowSummary="true" ValidationGroup="Create" />

验证器在没有回发的情况下显示错误,但摘要没有。

正如 cmets 中所建议的,页面上可能还有其他内容阻止了我的示例代码工作。我现在无法尝试重现确切的原因,虽然页面很重并且那里有一些 UpdatePanel,所以我会坚持我的 hack,直到有更多时间来处理它。

感谢您的帮助。我建议人们不要再处理这个问题,因为我认为我没有提供足够的信息来真正帮助任何人解决问题。

【问题讨论】:

  • 你能发布一个你的代码示例吗?使RequiredFieldValidator 与验证摘要一起工作时,我从来没有遇到过任何问题。
  • 尝试不使用 ValidationGroup 值。那里可能有一些混淆,因为没有在 TextBox 控件上指定组。
  • 可能是没有在 TextBox 本身上设置的 ValidationGroup。这应该不是问题,但如果是这样,我不会感到惊讶。我会尽量找时间研究一下。

标签: c# .net asp.net validation


【解决方案1】:

我也遇到过这个问题。在花费了太多时间剖析 MS 客户端验证 API ;) 之后,我将问题追溯到 DOM 解析的一个奇怪问题,下面我解释了为什么在某些情况下会发生这种情况以及我用来修复它的解决方案。

[为什么会这样?]

每个验证器控件都呈现为具有用于执行客户端验证的非标准属性的跨度。比如下面的evaluationfunction属性:

<span id="...id" controltovalidate="...BillingName" errormessage="blah" evaluationfunction="RequiredFieldValidatorEvaluateIsValid" display="Dynamic" initialvalue="" >*</span>

这些属性由 API 中的框架解析,如下所示(注意 eval):

for (i = 0; i < Page_Validators.length; i++) {
  val = Page_Validators[i];
  if (typeof(val.evaluationfunction) == "string") {
     eval("val.evaluationfunction = " + val.evaluationfunction + ";");
     } 
}

问题在于特殊属性,即评估函数,我们总是返回未定义的,因此字符串从未转换为正确的验证器对象。这对我来说仍然是个谜,因为据我所知,这似乎是完全随机的。

当 Page_ClientValidate 被启动时,它会尝试调用每个验证器的验证函数,但它不能,因为评估函数 == 未定义。它没有使用 false 作为默认值,而是假定为 true,因此实际上不会发生任何验证,并且从客户端看来一切都是有效的。 if (typeof(val.evaluationfunction) == "function") 永远不会为真,因此它依赖于之前的 val.isvalid = true; 分配。 p>

function ValidatorValidate(val, validationGroup, event) {
 val.isvalid = true;
 if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) 
 {
  if (typeof(val.evaluationfunction) == "function") 
  {
   val.isvalid = val.evaluationfunction(val);
   if (!val.isvalid && Page_InvalidControlToBeFocused == null && typeof(val.focusOnError) == "string" && val.focusOnError == "t") 
   {
    ValidatorSetFocus(val, event);
   }
  }
 }
  ValidatorUpdateDisplay(val);
} 

[我是如何解决的?]

为了解决这个问题,我编写了一个可以在 DOM 完成加载后调用的例程。此例程循环所有验证器控件并尝试使用 JQuery 从 SPAN 中的原始标记数据创建对象属性,尽管您可能使用任何其他等效工具来获得相同的结果。此例程并未修复所有验证器控件,主要是必需的字段验证器和正则表达式验证器。如果您使用具有其他属性的其他验证控件,则需要对其进行更改。

function fixValidatorProperties()
{
    if (Page_Validators && Page_Validators[0] && Page_Validators[0].evaluationfunction == undefined)
    {
        var val = null;
        for (i = 0; i < Page_Validators.length; i++) 
        {
            val = Page_Validators[i];

            if (val.initialvalue == undefined)
                val.initialvalue = "";

            if ($(val).attr("evaluationfunction"))
                  eval("val.evaluationfunction = " + $(val).attr("evaluationfunction") + ";");
            if ($(val).attr("controltovalidate"))
                  val.controltovalidate = $(val).attr("controltovalidate");
            if ($(val).attr("errormessage"))
                  val.errormessage = $(val).attr("errormessage");
            if ($(val).attr("Dynamic"))
                  val.Dynamic = $(val).attr("Dynamic");     
            if ($(val).attr("initialvalue"))
                  val.initialvalue = $(val).attr("initialvalue"); 
                if ($(val).attr("ValidationExpression"))  
                  val.validationexpression =  $(val).attr("ValidationExpression");
         }     
    }
}

【讨论】:

    【解决方案2】:

    我决定改用一些技巧,即使用 JQuery 设置一个点击处理程序,该处理程序检测页面上是否有任何错误,并仅显示一条一般消息,告诉用户查找并修复错误。 这不好,但现在可以了。

    【讨论】:

      【解决方案3】:

      我相信您必须在验证器的“文本”属性中实际输入值,才能在验证摘要中显示消息。 “错误消息”是验证器所在页面上显示的文本,而“文本”属性是验证摘要控件中显示的文本。

      【讨论】:

      • 如果未指定 Text 属性,ErrorMessage 用于验证摘要。另外,我也尝试使用文本字段。我已经使用 Firebug 进行了调试,这显然是一个客户端(Microsoft 代码)问题,验证摘要没有被更新。
      【解决方案4】:

      为了更方便的原版修复, 添加

      onblur="ValidationSummaryOnSubmit()"

      验证控制保护的每个输入字段

      更多详情请参考Validation summary AutoUpdate

      【讨论】:

        【解决方案5】:

        如果您指明您正在使用哪个客户端验证器,那么给出更详细的答案会更容易。但是,总的来说,这并不难;大多数客户端验证器允许您指定验证消息的显示位置,并且您可以将它们指向与保存 ValidationSummary 控件的位置相同的 HTML 元素

        【讨论】:

        • 我不确定你的意思。如果你能用代码展示一个例子,那就太好了。如果您想从我这里获得一些具体信息,请告诉我。我已编辑问题以指定我感兴趣的验证器类型。
        • 您是否使用任何 javascript 进行客户端验证?你用的是什么库?
        【解决方案6】:

        在“提交”按钮中,设置“CausesValidation=true”。这将强制客户端输入有效数据。如果您的验证控件未显示,则更有可能您没有将它们绑定到特定控件(我猜??)。您是否为必填字段验证器设置了“ControltoValidate”属性以指向您的文本框/字段想要验证?

        【讨论】:

        • 问题不在于让验证器工作。它们都在客户端和服务器端正常工作。问题特别在于让验证摘要在客户端上显示任何内容,而无需回发。我将通过编辑问题来显示代码。
        • 我试过你的代码,除了我必须向 LinkBut​​ton 添加一些文本。它起作用了,当我单击链接按钮时,除了启动必填字段验证外,我还看到了项目符号验证摘要。弹出窗口也给了我错误列表。我建议你创建一个新页面,复制上面的代码,看看它是否正常工作并将这个新页面与你的旧页面进行比较
        • 我同意 Ram 的观点——我能想到的就是你没有向我们展示一些东西?也许您有另一个控件导致提交不是创建验证组的成员?
        【解决方案7】:

        我知道这个问题不久前已经“解决”了,但我只是遇到了同样的问题。我们将网站从 .NET 3.5 升级到 .NET 4.0,客户端验证脚本停止工作。症状与詹姆斯在他出色的反应中所描述的完全一样。

        但是,至少对我来说,解决方案比詹姆斯提供的要简单得多。简单地说,我的 Web.Config 中的 xhtmlConformance 设置为 Legacy。将其设置为 Transitional 为我解决问题。

        因为它对我有用,所以我想用另一种可能更容易实施的解决方案来更新这篇文章。请注意此参考: http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx

        【讨论】:

          最近更新 更多