Я только что прочитал о новом атрибуте CompareAttribute MVC3, который можно применить к свойству модели, чтобы определить другое свойство, которому оно должно соответствовать - классический вариант использования - подтверждение правильности введенного адреса электронной почты или наличие полей Password и ConfirmPassword.Я столкнулся с проблемой при попытке реализовать его в своем собственном проекте.
У нас есть довольно стандартный объект User, который, помимо прочего, имеет следующие свойства:
public class User {
....
[Required, RegularExpression(RegularExpressions.Email, ErrorMessage = "Please supply a valid email address")]
public string EmailAddress
[Required]
public string Password
....
}
Затем я включил User и несколько других необходимых нам объектов в модель представления:
public class SignUpViewModel {
....
public User user { get; set; }
....
}
, которая при передаче в форму в пользовательском интерфейсе позволяет ModelBinder запускать проверку аннотации данныхдля объекта User, а также других объектов и типов примитивов в SignUpViewModel, когда пользователь отправляет форму.Я был очень рад, когда все это «просто сработало», потому что это означало, что мы можем определить валидацию только в одном месте и не иметь слишком много работы для сохранения в базе данных или сопоставления моделей пользовательского интерфейса с моделями доменов и т. Д.
Заметив, что Html.EditorFor (model => model.User.Password) испускает объект с именем, установленным в «User.Password», я добавил в SignUpViewModel следующее:
[Required, Compare("User.Password")]
public string ConfirmPassword { get; set; }
, но отправивФорма теперь вызывает ошибку проверки в соответствии с «Не удалось найти свойство с именем User.Password».Я надеялся, что он будет следовать соглашению такого же рода, но, похоже, не будет: (
Я действительно не хочу помещать ConfirmPassword в объект User, так как ConfirmPassword является чисто пользовательским интерфейсом, и кажется,неправильно иметь такое в доменном объекте, подобном этому. Я также не очень хочу сгладить различные объекты в SignUpViewModel, поскольку это начинает казаться дублированием того, где определены правила проверки, и мы пытаемся сохранить наш код какСУХОЙ, насколько это возможно.
Кто-нибудь сталкивался с способом заставить CompareAttribute работать со сравнением со свойствами одноуровневых объектов, а не со свойствами одноуровневого элемента, как это может показаться для атрибута?