【问题标题】:Show only unique error messages in ValidationSummary在 ValidationSummary 中仅显示唯一的错误消息
【发布时间】:2013-01-28 12:16:52
【问题描述】:

如何使ValidationSummary 控件仅显示唯一的错误消息?

我正在使用 Repeater 进行 CRUD 操作,并对某些字段使用验证控件(在 ItemTemplate 内)。例如,RequiredFieldValidator 用于 First Name/Last Name 列。我在验证器上设置了Text="*",这样就很容易发现验证失败的地方。在ValidationSummary 中,至少有 1 个验证器失败的每一列都应该有 1 条错误消息。

问题是ValidationSummary 会为验证失败的每一行显示相同的消息(这是预期的行为,但能够删除重复的错误消息会很好)。

示例,假设 2 行且未输入数据:

名字是必填项

名字是必填项

姓氏是必填项

姓氏是必填项

而不是期望的行为:

名字是必填项

姓氏是必填项

我发现的一个解决方案是在Repeater 之外为每一列使用CustomValidator,并将它们放在与ValidationSummary 相同的ValidationGroup 中,但我认为必须有更好的解决方案。

【问题讨论】:

    标签: asp.net .net validation webforms validationsummary


    【解决方案1】:

    我还显示了重复的消息,并找到了以下适用于我的 javascript 解决方案。

    Javascript:

    <script language="javascript" type="text/javascript">
    
    function RemoveValidationDuplicates(validationGroup) {
        Page_ClientValidate(validationGroup);
    
        if (typeof (Page_ValidationSummaries) == "undefined")
            return;
        var summary, sums, s;
        for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {
            summary = Page_ValidationSummaries[sums];
            summary.style.display = "none";
            if (!Page_IsValid) {
    
                if (summary.showsummary != "False") {
                    summary.style.display = "";
                    if (typeof (summary.displaymode) != "string") {
                        summary.displaymode = "BulletList";
                    }
                    switch (summary.displaymode) {
                        case "List":
                            headerSep = "<br/>";
                            first = "";
                            pre = "";
                            post = "<br/>";
                            final = "";
                            break;
                        case "BulletList":
                        default:
                            headerSep = "";
                            first = "<ul>";
                            pre = "<li>";
                            post = "</li>";
                            final = "</ul>";
                            break;
                        case "SingleParagraph":
                            headerSep = " ";
                            first = "";
                            pre = "";
                            post = " ";
                            final = "<br/>";
                            break;
                    }
                    s = "";
                    if (typeof (summary.headertext) == "string") {
                        s += summary.headertext + headerSep;
                    }
                    s += first;
    
                    for (i = 0; i < Page_Validators.length; i++) {
                        if (!Page_Validators[i].isvalid && typeof (Page_Validators[i].errormessage) == "string") {
                            var tempstr = pre + Page_Validators[i].errormessage + post;
                            var isExist = s.search(tempstr);
                            if (isExist == -1)
                                s += pre + Page_Validators[i].errormessage + post;
                        }
                    }
                    s += final;
                    summary.innerHTML = s;
                    window.scrollTo(0, 0);
                }
            }
        }
    }    
    </script>
    

    摘要和验证器共享一个 ValidationGroup,当提交按钮的 OnClientClick 被触发时,该 ValidationGroup 用作调用 RemoveValidationDuplicates 的输入:

    <div>
        <asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="validationGroupName"/>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ControlToValidate="TextBox1" ID="RequiredFieldValidator1" runat="server" ErrorMessage="RequiredFieldValidator" ValidationGroup="validationGroupName"></asp:RequiredFieldValidator>
        <br/>
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ControlToValidate="TextBox2" ID="RequiredFieldValidator2" runat="server" ErrorMessage="RequiredFieldValidator" ValidationGroup="validationGroupName"></asp:RequiredFieldValidator>
        <br/>
        <asp:TextBox ID="TextBox4" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ControlToValidate="TextBox4" ID="RequiredFieldValidator4" runat="server" ErrorMessage="RequiredFieldValidator1" ValidationGroup="validationGroupName"></asp:RequiredFieldValidator>
        <br/>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" OnClientClick="RemoveValidationDuplicates('validationGroupName')"/>
    </div>
    

    最初由 KIRAN 在csharpquery.blogspot.nl 上发布的解决方案

    3 月 23 日更新:更改了 javascript 函数以使其可重用,删除了一些冗余代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多