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