@ Решение Дарина Кимитрова, вероятно, является стандартом создания настраиваемого атрибута проверки, который работает с ненавязчивой проверкой. Однако использование пользовательских атрибутов проверки для ненавязчивой проверки имеет некоторые недостатки, такие как:
- Пользовательский атрибут проверки привязан только к одному свойству, поэтому проверка клиента не будет работать, если на двух других входах есть событие изменения.
- Сообщение об ошибке отлично работает с ValidationSummary, но если вы хотите отобразить 1 сообщение об ошибке для всей группы (что я считаю нормой), это будет почти невозможно.
- Чтобы избежать первой проблемы, мы можем добавить пользовательский атрибут проверки для каждого элемента в группе, что вызовет еще одну проблему: мы должны проверить все элементы группы вместо того, чтобы останавливаться на первом недопустимом элементе группы. И, конечно же, вторая проблема - отдельные сообщения об ошибках для каждого элемента - все еще остается.
Существует еще один способ обработки проверки входных данных на стороне клиента с использованием установки групп в jquery validator (https://jqueryvalidation.org/validate/#groups).). Единственная проблема (и большая) заключается в том, что ненавязчивая проверка не поддерживает группы проверки jquery по умолчанию. поэтому нам нужно немного настроить.
Хотя этот ответ вряд ли является «ненавязчивым», на мой взгляд, стоит попытаться избавиться от ненужного усложнения кода, если ваша конечная цель - проверить группу входов при использовании ненавязчивой библиотеки валидатора Microsoft.
Во-первых, поскольку групповые настройки валидатора jquery по умолчанию недоступны в ненавязчивом валидаторе jquery, мы должны переопределить ненавязчивые настройки (ссылка Как я могу настроить ненавязчивую валидацию в ASP.NET MVC 3 в соответствии с моим стилем? )
$("form").on('submit', function () {
var form = this;
var validator = $(this).data("validator");
if (validator.settings && !validator.settings.submitHandler) {
$.extend(true, validator.settings.rules, validationSettings.rules);
$.extend(true, validator.settings.groups, validationSettings.groups);
initGroups(validator);
var fnErrorReplacement = validator.settings.errorPlacement;
validator.settings.errorPlacement = function (error, element) {
validationSettings.errorPlacement(error, element, fnErrorReplacement, form);
}
validator.settings.submitHandler = formSubmitHandler;
}
});
function formSubmitHandler(form) {
form.submit();
}
После этого переопределите ненавязчивые группы валидатора, правила и настройки errorPlacement.
var validationSettings = {
groups: {
checkboxgroup: "Email Fax Phone"
},
rules: {
Email: {
required: function () {
return validateCheckboxGroup(["#Email", "#Fax", "#Phone"]);
}
},
Fax: {
required: function () {
return validateCheckboxGroup(["#Email", "#Fax", "#Phone"]);
}
},
Phone: {
required: function () {
return validateCheckboxGroup(["#Email", "#Fax", "#Phone"]);
}
}
}
,
errorPlacement: function (error, element, fnUnobtrusive, form) {
switch (element.attr("name")) {
case "Email":
case "Fax":
case "Phone":
onGroupError(error, "CheckBoxGroup", form);
break;
default:
fnUnobtrusive(error, element);
break;
}
}
}
function validateCheckboxGroup(names) {
var result = true;
$.each(names, function (index, value) {
if ($(value).is(":checked")) {
result = false;
}
});
return result;
}
Поскольку ненавязчивый валидатор не реализует настройку групп валидатора jquery, нам нужно повторно использовать две функции из двух библиотек для: (1) имен групп .split (повторное использование кода из валидатора jquery) и (2) добавления элемента ошибки без удаления класс 'input-validation-error' (повторное использование функции onError из ненавязчивой библиотеки).
function initGroups(validators) {
validators.groups = {};
$.each(validators.settings.groups,
function (key, value) {
if (typeof value === "string") {
value = value.split(/\s/);
}
$.each(value,
function (index, name) {
validators.groups[name] = key;
});
});
}
function onGroupError(error, inputElementName, form) {
var container = $(form).find("[data-valmsg-for='" + inputElementName + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.appendTo(container);
}
else {
error.hide();
}
}
Наконец, используйте HtmlExtensions.ValidationMessage, чтобы создать диапазон ошибок для группы флажков.
@Html.ValidationMessage("CheckBoxGroup", new { @class = "text-danger" })
Необходимо сохранить класс «input-validation-error», чтобы средство проверки jquery проверило все 3 элемента (Email, Phone, Fax) группы флажков в целом, вместо проверки одного за другим. Ненавязчивая библиотека проверки удаляет этот класс по умолчанию для функции onError, поэтому мы должны настроить ее как показано в функции onGroupError выше.