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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В нижней части страницы aspx просто добавьте тег script, приведенный ниже. Обратите внимание, что этот скрипт находится перед закрытием тегов 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" />
Другие вопросы по тегам