Поэтому мы используем 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