Поэтому мы используем DataAnnotations для проверки входных данных для наших форм ASP.NET MVC. Если бы мы начали заново, я бы подумал о Fluent Validation, но мы слишком далеко продвинулись, чтобы вносить изменения.
Итак, этот проект требует от нас создания множества форм. По мере продвижения мы определили группы входных данных, которые повторяются в формах. Примером этого может быть набор входных данных для представления адреса.
Затем мы превратили ввод Address в повторно используемый модуль, создав для него частичное представление _AddressEntry
вместе со связанной моделью представления — AddressViewModel
. Тогда модель представления для родительской формы выглядит так:
public class SubmitEnquiryViewModel
{
public AddressViewModel Address { get; set; }
public string Enquiry { get; set; }
...
}
Затем в виде _SubmitEnquiry
мы вставляем частичный вид _AddressEntry
, используя EditorFor()
.
Это работает нормально, пока мы не поймем, что разные экземпляры ввода Address имеют разные требования к проверке — атрибуты проверки, украшающие AddressViewModel
, не всегда применяются. Чтобы обойти проблему, мы определяем IAddressViewModel
:
public interface IAddressViewModel
{
string LineOne { get; set; }
string LineTwo { get; set; }
...
}
А затем определите конкретные реализации этого интерфейса для всех различных перестановок спецификации проверки - например. AddressViewModel
(проверка по умолчанию), AddressNoValidationViewModel
и т. д.
Затем частичное представление _AddressEntry
привязывается к IAddressViewModel
, и для свойства Address модели родительского представления выбирается соответствующая конкретная реализация.
Главный недостаток этого подхода заключается в том, что потенциально мы можем получить довольно много моделей представлений, которые отличаются только применяемыми к ним атрибутами проверки. Это считается приемлемым, поскольку ожидается, что количество повторно используемых модулей будет относительно небольшим.
Кто-нибудь еще сталкивался с этой проблемой раньше? Какое решение вы придумали? Что вы думаете о решении, описанном выше?
DataAnnotations
атрибуты проверки OOTB и позволяяDefaultModelBinder
делать свое дело (и, таким образом,DataAnnotationsModelValidator
, я думаю). - person James Rogers   schedule 25.10.2014