代码之家  ›  专栏  ›  技术社区  ›  David

有没有一种方法可以让验证摘要与客户端验证程序一起工作?

  •  9
  • David  · 技术社区  · 16 年前

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

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

    我希望在验证摘要中反映具有客户端验证的任何标准.NET验证程序,但我最关心的是使所需的FieldValidator工作。

    我可以破解它,这样在短时间延迟后,点击按钮会自动显示一条常规消息,告诉用户检查页面上的错误。这在没有回邮的情况下是有效的,但这是丑陋的。

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

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

    验证程序不带回发显示错误,但摘要不显示。

    正如注释中所建议的,页面上可能还有其他东西阻止了我的示例代码的工作。我现在无法复制确切的原因,虽然页面很重,上面有一些更新面板,所以我将坚持我的黑客,直到有更多的时间来处理它。

    谢谢你的帮助。我建议人们不要再研究这个问题了,因为我认为我提供的信息还不足以真正帮助任何人解决这个问题。

    7 回复  |  直到 11 年前
        1
  •  12
  •   James    11 年前

    我也有这个问题。在花了太多时间分析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 + ";");
         } 
    }
    

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

    当启动页面“clientvalidate”时,它会尝试调用每个验证程序validate函数,但不能这样做,因为evaluationfunction==未定义。它不使用“假”作为默认值,而是假定为“真”,因此实际上不会进行任何验证,并且从客户端看,所有内容都是有效的。这个 if(typeof(val.evaluationfunction)==“函数”) 永远不会是真的,所以它取决于 val.isvalid=真; .

    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
  •  1
  •   David    16 年前

    我决定实施一点黑客,这是使用jquery设置一个点击处理程序,检测页面上是否有任何错误,并只显示一条常规消息告诉用户查找和修复错误。 这不好,但暂时可以。

        3
  •  1
  •   Amanda Kitson    16 年前

    我相信您必须在验证程序的“文本”属性中输入值,以便在验证摘要中显示消息。“错误消息”是显示在验证程序所在页上的文本,“文本”属性是显示在验证摘要控件中的文本。

        4
  •  1
  •   Community Mohan Dere    9 年前

    为了更方便的香草口味, 添加

    onblur=“validationSummaryOnSubmit()”

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

    详情请参阅 Validation summary AutoUpdate

        5
  •  0
  •   Tomas Aschan    16 年前

    如果你指出的话,给出更详细的答案会更容易。 哪一个 您使用的客户端验证程序。但是,一般来说,这并不难;大多数客户端验证器允许您指定验证消息应该出现在哪里,并且您可以将它们指向与保留验证摘要控件相同的HTML元素。

        6
  •  0
  •   ram    16 年前

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

        7
  •  0
  •   Dan7el    12 年前

    我知道这个问题早就“解决”了,但我只是碰到了同样的问题。我们将站点从.NET 3.5升级到.NET 4.0,客户端验证脚本停止工作。这些症状和詹姆斯在他出色的反应中描述的完全一样。

    然而,这个决议,至少对我来说,比詹姆斯提供的要简单得多。简而言之, XHTML信息 在我的web.config中设置为 遗产 . 将其设置为 过渡时期 帮我解决问题。

    因为它对我有效,我想用另一个更容易实现的解决方案来更新这个帖子。注意此参考: http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx