Я вижу ваше затруднительное положение. Я ищу другие решения для проверки также в отношении сложных правил проверки, которые могут применяться к более чем одному свойству данного объекта модели или даже ко многим свойствам различных объектов модели в графе объектов (если вам не повезло проверять связанные объекты как это).
Ограничение интерфейса IDataErrorInfo
состоит в том, что объект модели удовлетворяет действительному состоянию просто тогда, когда ни одно из свойств не содержит ошибок. Это означает, что объект valid - это объект, в котором все его свойства также valid . Однако у меня может возникнуть ситуация, когда свойства A, B и C допустимы - тогда весь объект действителен. , но также , если свойство A недопустимо, но B и C Есть, то объект удовлетворяет действительности. У меня просто нет возможности описать это условие / правило с помощью атрибутов IDataErrorInfo
interface / DataAnnotations
.
Итак, я нашел этот делегатский подход . На момент написания этой статьи многие полезные усовершенствования в MVC еще не существовали, но основная концепция должна вам помочь. Вместо того чтобы использовать атрибуты для определения условий проверки объекта, мы создаем функции-делегаты, которые проверяют более сложные требования, и поскольку они делегированы, мы можем использовать их повторно. Конечно, это больше работы, но использование делегатов означает, что мы сможем написать код правила проверки один раз и , чтобы хранить все правила проверки в одном месте (возможно, на уровне обслуживания) и (бит kool) даже используют MVC 2 DefaultModelBinder
для автоматического запуска проверки (без куч проверки в действиях нашего контроллера - как в блоге Скотта говорится, что мы можем делать с DataAnnotations
. См. последний абзац перед заголовком «Сильно типизированные помощники пользовательского интерфейса»)
Я уверен, что вы можете немного улучшить подход, предложенный в приведенной выше статье, с помощью анонимных делегатов, таких как Func<T>
или Predicate<T>
, а написание пользовательских блоков кода для правил проверки позволит включить условия между свойствами (например, условие, на которое вы ссылались, если ваше ShippingSameAsBilling
свойство имеет значение true, тогда вы можете игнорировать дополнительные правила для адреса доставки и т. д.).
DataAnnotations
служит для создания простых правил проверки объектов действительно просто с очень небольшим кодом. Но по мере развития ваших требований вам придется проверять более сложные правила. Новые виртуальные методы в модуле связывания моделей MVC2 должны и впредь предоставлять нам способы интеграции наших будущих проверочных изобретений в инфраструктуру MVC.