有没有办法让ValidationSummary与客户端验证器一起使用?

时间:2009-12-07 00:05:35

标签: c# .net asp.net validation

.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" />

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

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

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

7 个答案:

答案 0 :(得分:12)

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

[为什么会这样?]

每个验证程序控件都呈现为具有非标准属性的span,用于执行客户端验证。例如,下面的评估函数属性:

<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被启动时会发生什么,它会尝试调用每个验证器验证函数,但它不能,因为evaluatefunction == undefined。它不是使用false作为默认值,而是假定为true,因此实际上不会进行验证,并且所有内容在客户端都显示为有效。 if(typeof(val.evaluationfunction)==“function”)永远不会是真的,因此它会回退到 val.isvalid = true; 的先前分配。

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");
         }     
    }
}

答案 1 :(得分:1)

我决定实现一些黑客攻击,即使用JQuery设置一个单击处理程序,检测页面上是否有任何错误,只显示一条消息,告诉用户查找并修复错误。 它不好,但它现在会做。

答案 2 :(得分:1)

我认为您必须在验证程序的“Text”属性中实际输入值才能在验证摘要中显示消息。 “错误消息”是验证程序所在页面上显示的文本,但“文本”属性是验证摘要控件中显示的文本。

答案 3 :(得分:1)

为了更方便的香草修复, 添加

  

的onblur = “ValidationSummaryOnSubmit()”

到由validationcontrol保护的每个输入字段

有关详细信息,请参阅Validation summary AutoUpdate

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我知道这个问题已经“解决”了一段时间,但我遇到了同样的问题。我们将站点从.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