Как я могу добиться эффекта нескольких групп валидации на одном элементе управления валидацией?

Мне нужно иметь возможность применять несколько групп проверки к некоторым элементам управления на моей странице, потому что для каждого из трех «режимов» отправки существует свой набор обязательных полей.

У меня есть три кнопки отправки, и у каждой есть своя группа проверки (отклонить, утвердить и сохранить). «Отклонить» на самом деле не содержит обязательных полей в настоящее время, но может появиться в будущем. «Сохранить» требует только «имя» и «фамилию», в то время как «одобрить» требует «имя», «фамилию», а также «имя группы».

Я попытался просто поместить несколько групп проверки в значение атрибута (как в приведенном ниже коде), но проверка вообще не сработала.

Я также попытался вообще не указывать группу, чтобы просто всегда срабатывать проверка, но опять же, она вообще не срабатывала.

<div>
    <label for='<%= txt_FirstName.ClientID %>'>First Name</label>
    <asp:TextBox ID="txt_FirstName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="rfv_FirstName" runat="server" text="Required"
        ControlToValidate="txt_FirstName" ValidationGroup="approve save">
    </asp:RequiredFieldValidator>
</div>
<div>
    <label for='<%= txt_LastName.ClientID %>'>Last Name</label>
    <asp:TextBox ID="txt_LastName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="rfv_LastName" runat="server" text="Required"
        ControlToValidate="txt_LastName" ValidationGroup="approve save">
    </asp:RequiredFieldValidator>
</div>
<div>
    <label for='<%= ddl_GroupName.ClientID %>'>Group Name</label>
    <asp:DropDownList ID="ddl_GroupName" runat="server"></asp:DropDownList>
    <asp:RequiredFieldValidator ID="rfv_GroupName" runat="server" text="Required"
        ControlToValidate="ddl_GroupName" ValidationGroup="approve">
    </asp:RequiredFieldValidator>
</div>
<div>
    <asp:Button ID="btn_Reject" runat="server" Text="Reject"
        ValidationGroup="reject" OnClick="btn_Reject_Click" />
    <asp:Button ID="btn_Approve" runat="server" Text="Approve"
        ValidationGroup="approve" OnClick="btn_Approve_Click" />
    <asp:Button ID="btn_Save" runat="server" Text="Save"
        ValidationGroup="save" OnClick="btn_Save_Click" />
</div>

Я уверен, что смогу добиться желаемого эффекта с помощью некоторого дополнительного кода или дублированных элементов управления валидатором для каждой группы валидации, но я надеялся, что у инфраструктуры веб-форм будет более простой встроенный способ сделать это.

ОБНОВЛЕНИЕ (02.01.2018):
Вопрос «Можно ли назначить несколько групп проверки для одного элемента управления проверкой?» - это мой частный случай. У него один элемент управления в нескольких группах, тогда как у меня есть несколько элементов управления с несколькими перекрывающимися группами. Кроме того, в ответе предлагается наличие элемента управления проверкой для каждой комбинации ввода / группы. Это ужасное решение, потому что, среди прочего, оно нарушает принцип программирования DRY (не повторяйтесь) и затрудняет обслуживание / усовершенствования.

Вышеупомянутое также связывает вопрос «Как выполнить проверку по нескольким группам проверки?». Этот вопрос - совершенно другая проблема (группы проверки в группах проверки), и его ответ предлагает настраиваемый javascript, который необходимо написать для каждой кнопки отправки на каждой странице, требующей нескольких групп проверки.

Я ищу общее решение, которое я могу написать / реализовать один раз и применить ко всему веб-приложению, и поэтому я не считаю свой вопрос дубликатом вышеупомянутых вопросов.

ОБНОВЛЕНИЕ (2018-01-03):
Между другими вопросами / статьями, с которыми я столкнулся при исследовании моей проблемы, а также благодаря любезной помощи a.bajorinas и Sunil, я установил, что невозможно иметь несколько групп проверки в контрольном элементе управления, и для достижения желаемого эффекта потребуется специальный код. Я обновил вопрос соответствующим образом, чтобы помочь всем, кто хочет достичь этого в будущем.

Я буду тестировать решение, которое включает элементы из ответов a.bajorinas и Сунила, и, надеюсь, смогу предоставить обновление позже.


person Eric    schedule 31.12.2018    source источник
comment
comment
Вы можете попробовать опубликованный мной ответ, который был мной проверен. Обратите внимание, что кнопка, которая проверяет несколько групп, должна иметь список с разделителями-запятыми, указанный для свойства validationGroup, как в ValidationGroup="group1, group2". Кроме того, несколько групп проверки должны быть указаны на уровне управления отправкой, как для кнопки, но не для валидатора, который не отправляет страницу.   -  person Sunil    schedule 02.01.2019
comment
@ a.bajorinas Пожалуйста, прочтите отредактированное мной объяснение, почему это не дубликат.   -  person Eric    schedule 02.01.2019


Ответы (2)


Единственное, что я могу придумать для вашего желаемого варианта использования, - это установить ValidationGroup для ваших валидаторов в коде за нажатием кнопки, имейте в виду, что сначала выполняется обратная передача, а затем проверяются элементы управления, которые могут вам не подходить.

protected void btn_save_click(object sender, EventArgs e){
    rfv_FirstName.ValidationGroup = "save";
    Page.Validate("save");
    if (Page.IsValid)
    {
        //logic if validators pass
    }
}

Это позволит вам повторно использовать валидаторы для нескольких групп. Также в моей связанной публикации один из комментариев к выбранному ответу гласит: «Невозможно назначить несколько групп элементу проверки».

person a.bajorinas    schedule 02.01.2019
comment
Нам действительно нужна проверка на стороне клиента, а также на сервере, но я думаю, что мы сможем сколотить многоразовое решение на основе как ваших предложений, так и предложений Сунила. У меня, вероятно, не будет времени тестировать это еще неделю или две, но я ценю помощь. - person Eric; 03.01.2019

ASP.Net не поддерживает несколько групп проверки. Однако с помощью небольшого количества кода JavaScript вы можете заставить его поддерживать несколько групп проверки. Что вам нужно сделать, так это переопределить стандартную функцию JavaScript IsValidationGroupMatch. Эта функция является частью стандартной библиотеки проверки в ASP.Net.

Внизу страницы aspx просто добавьте тег скрипта, указанный ниже. Обратите внимание, что этот сценарий находится непосредственно перед закрытием тегов form, body и html, что важно при переопределении функции JavaScript.

<script type="text/javascript">
            window["IsValidationGroupMatch"] = function (control, validationGroup) {
                if ((typeof (validationGroup) == "undefined") || (validationGroup == null)) {
                    return true;
                }
                var controlGroup = "";
                var isGroupContained = false;
                if (typeof (control.validationGroup) == "string") {
                    controlGroup = control.validationGroup;
                    var controlGroupArray = [];
                    if (validationGroup.indexOf(",") > -1) {
                        controlGroupArray = validationGroup.split(",");// validationGroup.split(",");
                    }
                    for (var i = 0; i < controlGroupArray.length; i++) {
                        if (controlGroupArray[i].trim() == controlGroup.trim()) {
                            isGroupContained = true;
                        }
                    }
                }
                return (controlGroup == validationGroup || isGroupContained);
            }
        </script>
    </form>
</body>
</html>

Как только вы это сделаете, вы можете добавить разделенный запятыми список групп проверки для кнопки, которая проверяет несколько групп проверки, как в примере ниже. В примере ниже кнопка с идентификатором btnMultipleValidationGroups проверяет как group1, так и group2.

<div>
            TextBox1 : 
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="TextBox1 needs input"  ControlToValidate="TextBox1" ForeColor="Red" ValidationGroup="group1"></asp:RequiredFieldValidator>

            <br />
            <br />
            TextBox2 : 
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="TextBox2 needs input"  ControlToValidate="TextBox2" ForeColor="Red" ValidationGroup="group2"></asp:RequiredFieldValidator>
            <br />
            <br />
            TextBox3 :
             <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="TextBox3 needs input"  ControlToValidate="TextBox3" ForeColor="Red" ValidationGroup="group3"></asp:RequiredFieldValidator>

            <br />
            <br />
        </div>
        <asp:Button ID="btnMultipleValidationGroups" runat="server" Text="Validate group1 and group2" ValidationGroup="group1,group2" OnClick="btnMultipleValidationGroups_Click" />
        <asp:Button ID="btnGroup1" runat="server" Text="Validate only group1" ValidationGroup="group1" OnClick="btnGroup1_Click" />
        <asp:Button ID="btnGroup2" runat="server" Text="Validate only group2" ValidationGroup="group2" OnClick="btnGroup2_Click" />
person Sunil    schedule 02.01.2019
comment
Как я уже упоминал, я надеялся избежать написания какого-либо специального кода для достижения этой функциональности, но похоже, что я мог бы применить ваше решение ко всему веб-сайту, что может быть полезно в дальнейшем с этим проектом. - person Eric; 02.01.2019
comment
Да, вы можете применить его ко всему проекту, добавив этот скрипт на главную страницу. Как я уже сказал, ASP.Net не поддерживает несколько групп. Кроме того, имейте в виду, что вы должны использовать несколько групп только в элементах управления отправкой, таких как кнопка, а не в валидаторах. - person Sunil; 02.01.2019
comment
Ах, я пропустил этот последний момент, когда впервые рассматривал это решение. Нам нужно, чтобы сами валидаторы имели несколько групп, а не кнопки. Предоставьте Microsoft сделать, казалось бы, простую задачу такой чертовски сложной. ;) - person Eric; 03.01.2019
comment
@Eric, наличие нескольких групп валидации для валидатора не имеет смысла, поскольку валидатор, отличный от пользовательского валидатора, может быть привязан к одному и только одному элементу управления. Таким образом, у вас не может быть RequiredFieldValidator, который проверяет два текстовых поля, т.е. он должен проверять только одно текстовое поле. Из-за этого нет смысла иметь несколько групп валидации для одного валидатора. - person Sunil; 05.01.2019
comment
Мне не нужен один валидатор для проверки нескольких элементов управления. Мне нужен один валидатор для проверки одного элемента управления, когда активна одна из нескольких доступных групп валидации. Например, требовать TextBox1, когда группа проверки group1 или group2 активна, но не когда активна group3. - person Eric; 22.01.2019
comment
Затем вы должны попробовать добавить несколько групп проверки, как я уже упоминал в своем ответе на элемент управления проверкой. Добавьте соответствующие группы к кнопке, вызывающей проверку. - person Sunil; 22.01.2019