У меня есть пользовательский Атрибут Подтверждения правильности данных, который я создал для проверки паролей, вводы данных пользователем являются тем же, но IsValid никогда не вызывается.
Пользовательский атрибут:
public class IsSameAsAttribute : ValidationAttribute
{
public String TargetProperty { get; set; }
private readonly object _typeId = new object();
public IsSameAsAttribute(string targetProperty)
{
TargetProperty = targetProperty;
}
public override bool IsValid(object value)
{
return false;
//Type objectType = value.GetType();
//bool isValid = false;
//PropertyInfo[] neededProperties =
// objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray();
//return isValid;
}
public override object TypeId
{
get { return _typeId; }
}
}
Модель данных к этому относятся:
public class RegistrationData
{
[Required(ErrorMessage = "First Name Required")]
[StringLength(100, ErrorMessage = "First Name must be 100 characters or less.")]
public String FirstName { get; set;}
[Required(ErrorMessage = "Last Name Required")]
[StringLength(100, ErrorMessage = "Last Name must be 100 characters or less.")]
public String LastName { get; set; }
[Required(ErrorMessage = "Email is Required")]
[StringLength(200, ErrorMessage = "Email must be 200 characters or less.")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")]
public String Email { get; set; }
[Required(ErrorMessage = "Password is required")]
public String Password { get; set; }
[IsSameAs("Password")]
public String PasswordRepeat { get; set; }
[Required(ErrorMessage = "Division is required")]
public String Division { get; set; }
}
И Контроллер, откуда это называют:
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
Весь "из поля" проверки работают правильно, просто мой пользовательский не вызывается. В выполнении отладки я нахожу, что это инстанцируют, как конструктора вызывают, но набор точки останова на IsValid никогда не поражается.
Что продолжается и как я фиксирую его?
ОБНОВЛЕНИЕ
Хорошо я играл некоторые и если я называю TryUpdateModel (модель) в моем контроллере, это наконец вызывает IsValid. Таким образом, это подразумевает мне, что мой пользовательский атрибут не становится "зарегистрированным" в любых выполнениях проверки в MVC 2. Существует ли способ обратиться к этому?
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
TryValidateModel(model); // <--- *** Added this line and it "works"
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
Вы пытались заполнить все остальные поля, чтобы все готовые проверки были выполнены, и посмотреть, запускается ли ваша настраиваемая проверка? Если проверка клиента не удовлетворена, форма не сможет быть отправлена обратно, и, таким образом, ваша настраиваемая проверка на стороне сервера не будет запущена,
Чтобы ваш настраиваемый атрибут проверки работал на стороне клиента, необходимо выполнить некоторую дополнительную работу. сделал.
Прочтите отличный пост Фила о валидации здесь: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx