Пользовательские аннотации данных IsValid никогда не вызывается.(ASP.NET MVC 2 .NET 4) - PullRequest
7 голосов
/ 30 июня 2010

У меня есть собственный атрибут проверки данных, который я создал, чтобы убедиться, что пароли, введенные пользователем, совпадают, но 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, никогда не срабатывает.

Что происходит и как это исправить?

UPDATE

Хорошо, я немного поковырялся, и если я вызову 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);
}

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Я вижу похожую / такую ​​же / связанную проблему с MVC2 - проверка на уровне класса вызывается, только если все свойства проверяются правильно.

Таким образом, несколько свойств могут потерпеть неудачу, и все сообщения проверки добавляются в состояние модели (и отображаются на клиенте.) Но среди них нет сообщения проверки уровня класса;IsValid для этих вызывается только если свойства проходят.Немного обидно с точки зрения юзабилити, но это работает.

Я не , вызывающий TryValidateModel ().

0 голосов
/ 30 июня 2010

Вы пытались заполнить все остальные поля, чтобы все готовые проверки были выполнены, и посмотреть, запущена ли ваша пользовательская проверка? Если проверка клиента не будет выполнена, форма не будет отправлена ​​обратно, и, таким образом, пользовательская проверка на стороне сервера не будет инициирована,

Чтобы ваш настраиваемый атрибут проверки работал на стороне клиента, необходимо выполнить дополнительную работу.

Читайте отличный пост Фила о проверке здесь: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

...