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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 января 2019

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

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

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

0 голосов
/ 02 января 2019

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

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

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