MVC3 ненавязчивая группа валидации

Мне нужно проверить 3 или более полей ввода (требуется только для одного). Например, у меня есть электронная почта, факс, телефон.

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

Вы можете написать собственный атрибут:

public class AtLeastOneRequiredAttribute : ValidationAttribute, IClientValidatable { private readonly string[] _properties; public AtLeastOneRequiredAttribute(params string[] properties) { _properties = properties; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (_properties == null || _properties.Length < 1) { return null; } foreach (var property in _properties) { var propertyInfo = validationContext.ObjectType.GetProperty(property); if (propertyInfo == null) { return new ValidationResult(string.Format("unknown property {0}", property)); } var propertyValue = propertyInfo.GetValue(validationContext.ObjectInstance, null); if (propertyValue is string && !string.IsNullOrEmpty(propertyValue as string)) { return null; } if (propertyValue != null) { return null; } } return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = ErrorMessage, ValidationType = "atleastonerequired" }; rule.ValidationParameters["properties"] = string.Join(",", _properties); yield return rule; } } 

который может быть использован для украшения одного из ваших свойств модели просмотра (тот, который вы хотите выделить, если проверка не завершена):

 public class MyViewModel { [AtLeastOneRequired("Email", "Fax", "Phone", ErrorMessage = "At least Email, Fax or Phone is required")] public string Email { get; set; } public string Fax { get; set; } public string Phone { get; set; } } 

а затем простой controller:

 public class HomeController : Controller { public ActionResult Index() { var model = new MyViewModel(); return View(model); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 

Предоставление следующего представления, которое позаботится о том, чтобы определить пользовательский адаптер проверки подлинности на стороне клиента:

 @model MyViewModel    @using (Html.BeginForm()) { @Html.ValidationSummary(false) 
@Html.LabelFor(x => x.Email) @Html.EditorFor(x => x.Email)
@Html.LabelFor(x => x.Fax) @Html.EditorFor(x => x.Fax)
@Html.LabelFor(x => x.Phone) @Html.EditorFor(x => x.Phone)
}

Разумеется, пользовательское правило адаптера и валидатора должно быть экстрадировано в отдельный файл javascript, чтобы избежать смешивания скрипта с разметкой.

Я потратил более 36 часов, почему код не работал для меня. В конце я узнал, что в моем случае я не должен был использовать имена свойств в этой строке кода

 [AtLeastOneRequired("Email", "Fax", "Phone", ErrorMessage = "At least Email, Fax or Phone is required")] 

Но мне пришлось использовать идентификаторы элементов HTMl вместо имен свойств, и он работал как магия.

Проводя это здесь, если это может помочь кому-то.

Поскольку вы используете MVC 3, посмотрите на отличное видео, которое Брэд Уилсон имел на mvcConf. Все, что вам нужно, чтобы создать клиент + сервер. Ненавязчивая проверка

Решение @Darin Kimitrov, вероятно, является стандартом создания специального атрибута проверки, который работает с ненавязчивой проверкой. Однако использование пользовательских атрибутов проверки для ненавязчивой проверки имеет некоторые недостатки, такие как:

  • Пользовательский атрибут проверки привязан только к одному из свойств, поэтому проверка клиента не будет работать, если на других двух входах есть событие изменения.
  • Сообщение об ошибке отлично работает с ValidationSummary, но если вы хотите отобразить 1 сообщение об ошибке для всей группы (что, я думаю, является нормой), это было бы почти невозможно.
  • Чтобы избежать первой проблемы, мы можем добавить специальный атрибут проверки для каждого элемента в группе, что вызовет еще одну проблему: мы должны проверить все элементы группы, а не останавливаться на первом недопустимом элементе группы. И, конечно же, вторая проблема – отдельные сообщения об ошибках для каждого элемента – все еще остается.

Существует еще один способ обработки клиентской проверки группы входов, используя настройки групп в валидаторе jquery ( https://jqueryvalidation.org/validate/#groups ). Единственная проблема (и большая) заключается в том, что ненавязчивая проверка не поддерживает по умолчанию группы проверки jquery, поэтому мы должны немного настроить ее.

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

Во-первых, поскольку настройки групп по умолчанию для проверки подлинности jquery недоступны в jquery unobtrusive validator, мы должны переопределить ненавязчивые настройки (см. Как настроить ненавязчивую проверку в 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(); } 

После этого переопределите ненавязчивые группы валидатора, правила и параметры настройки ошибки.

 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 validator, нам нужно повторно использовать две функции из двух библиотек, чтобы: (1) .split имена групп (повторное использование кода из jquery validator) и (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" }) 

Сохранение classа «проверка ввода-ошибки» необходимо, так что валидатор jquery будет проверять все 3 элемента (электронная почта, телефон, факс) группы флажков в целом, вместо проверки один за другим. Ненавязчивая библиотека проверки удаляет этот class по умолчанию в функции onError, поэтому мы должны настроить это, как показано в функции onGroupError выше.

  • MVC HTML Helpers и выражения lambda
  • Стандартное связывание модели ASP.NET MVC 3 не связывает десятичные свойства
  • Как связать вложенные ViewModels с View на Controller в MVC3?
  • ASP.net MVC 3 jQuery Validation; Отключить ненавязчивый OnKeyUp?
  • Ошибка Razor intellisense: функция «метод расширения» не может использоваться, поскольку она не является частью спецификации языка ISO-2 C #
  • JQuery Datepicker Chrome
  • Ограничение типа множественного типа (ИЛИ)
  • Получите количество слушателей, клиентов, подключенных к концентратору SignalR
  • ASP.NET MVC Url Route поддерживает (точка)
  • MVC3 DropDownListFor - простой пример?
  • Entity Framework 5 Обновление записи
  • Interesting Posts

    Проблема Bizarre DNS

    Как проверить естественную ориентацию устройства (по умолчанию) на Android (т. Е. Получить пейзаж, например, Motorola Charm или Flipout)

    Как изменить направление текста в Windows?

    Fsck error: в настоящее время поддерживается только 1 или 2 FAT, а не 34

    Инструмент для отправки запроса multipart / form-data

    OpenERP 7 Как предоставить пользователям доступ к настраиваемому модулю в OpenERP 7?

    Мой диск SSD выровнен с 4k секторами, и если нет, то как его исправить?

    Заставить камеру всегда открывать в портретном режиме в android

    Извлечь черно-белое изображение из формата NV21 от андроидной камеры

    Блокировка веб-сайтов с брандмауэром Windows

    Проводник Windows 7 не использует просмотр сведений в папках со средствами массовой информации

    Перенаправление на Ajax Jquery Call

    Внешний жесткий диск не может безопасно удалить

    MVVM Light 5.0: как пользоваться навигационной службой

    Зачем создавать «Implicitly Unwrapped Optionals», так как это означает, что вы знаете, что есть ценность?

    Давайте будем гением компьютера.