Условная проверка на классе модели MVC3 - PullRequest
1 голос
/ 21 августа 2011

Я использую Entity Framework и класс Model, DonationForm, обернутый классом модели представления "CreateDonationForm".

В соответствии с принципом DRY я добавил аннотации проверки для класса Model (а не только для модели представления), чтобы они могли использоваться повторно. Однако не все свойства класса будут использоваться всегда (некоторые на самом деле являются взаимоисключающими). Например, , когда относится к определенному свойству номера телефона, я хочу, чтобы оно соответствовало аннотации Regex и было обязательным. Но в другой ситуации я хочу иметь возможность отправить (и сохранить в базе данных) нулевое значение.

После этого сообщения: Как использовать IValidatableObject?

Я заставил класс модели реализовать IValidatableObject и реализовал настраиваемую проверку, чтобы выборочно удалять ошибки проверки из объекта ValidationResult (когда поле было частью группы полей, которые не были релевантны, учитывая другие варианты выбора пользователя в форме) , Это сработало, и мне удалось вернуть список ValidationResults, в котором эти ошибки были удалены.

Однако, когда я вызываю SaveChanges (), я получаю ошибки проверки, которые не позволяют сохранить. Проверка все еще происходит на уровне класса базы данных / модели. (База данных была сгенерирована из класса Model с использованием EF 4.1 Code First.)

Как можно получить правила условного форматирования и при этом использовать аннотации в классе Model? По сути, это говорит о том, что применяйте эти правила проверки, ЕСЛИ в противном случае эти правила проверки не применяются. Пожалуйста, тренируйте меня здесь. Я новичок в MVC и пытаюсь сделать все правильно. Похоже, что можно поставить проверку модели представления и затем сопоставить значения с базовым классом модели; однако, это не правильно. Я вижу большую ценность в наличии атрибутов валидации самого класса Model и большого количества ненужной повторяющейся работы по размещению одних и тех же аннотаций в моделях представления создания и обновления. Такое ощущение, что я борюсь с MVC Fw здесь за то, что должно быть проще. Будем весьма благодарны за любые идеи, которые вы можете предоставить.

1 Ответ

4 голосов
/ 21 августа 2011

Есть много классных принципов, но иногда небольшие нарушения делают вашу жизнь проще. Избавьтесь от аннотаций данных из вашей модели EF и поместите их в модель представления, где они принадлежат. Вы по-прежнему можете использовать IValidatableObject в модели представления и составлять проверку из нескольких вспомогательных методов многократного использования, используемых в нескольких моделях представления (так что вы все равно можете достигнуть принципа СУХОЙ).

Если вы упрямый и действительно хотите иметь проверку в модели EF, отключите проверку в EF и обработайте ее на верхнем уровне, как вы уже это делаете:

dbContext.Configuration.ValidateOnSaveEnabled = false; 

Проверка уровня EF предназначена для простых сценариев, в которых ваши правила проверки не меняются между операциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...