Показывать только уникальные сообщения об ошибках в ValidationSummary

Как сделать элемент управления ValidationSummary отображать только уникальные сообщения об ошибках?

Я использую Repeater для выполнения операций CRUD и использую элементы управления проверкой (внутри ItemTemplate) для некоторых полей. Например, RequiredFieldValidator для столбцов Имя/Фамилия. Я установил Text="*" на валидаторах, чтобы было легко определить, где проверка не удалась. В ValidationSummary должно быть 1 сообщение об ошибке для каждого столбца, в котором хотя бы 1 валидатор не работает.

Проблема в том, что ValidationSummary будет отображать одно и то же сообщение для каждой строки, в которой проверка не пройдена (это ожидаемое поведение, но было бы неплохо иметь возможность удалять повторяющиеся сообщения об ошибках).

Пример, предполагающий 2 строки и отсутствие введенных данных:

Требуется имя

Требуется имя

Требуется фамилия

Требуется фамилия

Вместо желаемого поведения:

Требуется имя

Требуется фамилия

Я нашел одно решение — использовать CustomValidator вне Repeater для каждого столбца и поместите их в то же ValidationGroup, что и ValidationSummary, но я думаю, что должно быть лучшее решение.


person Răzvan Flavius Panda    schedule 28.01.2013    source источник


Ответы (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, которая служит входными данными для вызова RemoveValidationDuplicates при срабатывании OnClientClick кнопки отправки:

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

Обновление от 23 марта: изменена функция javascript, чтобы ее можно было использовать повторно, удален некоторый избыточный код.

person alpha pecap    schedule 20.03.2013