Как добавить пользовательский метод проверки для viewmodel - PullRequest
1 голос
/ 23 сентября 2011

Я пытался добавить пользовательский валидатор для класса ViewModel:

[Serializable]
public class UserViewModel : IValidatableObject 
{
    public IEnumerable<ValidationResult> Validate(ValidationContext context)
    {
        yield return new ValidationResult("Fail this validation");
    }
}

К сожалению, это не срабатывает, когда вызывается метод Action, например,

    [HttpPost]
    public ActionResult Edit(UserViewModel user)

Как добавить собственную логику проверки? Атрибут ValidationAttribute не предоставляет достаточно простого решения. Я не могу найти четкую информацию о механизмах проверки MVC2.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

IValidatableObject не поддерживается в ASP.NET 2.0. Поддержка этого интерфейса была добавлена ​​в ASP.NET MVC 3. Вы можете определить пользовательский атрибут:

[AttributeUsage(AttributeTargets.Class)]
public class ValidateUserAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        UserViewModel user = value as UserViewModel;
        // TODO: do some validation

        ErrorMessage = "Fail this validation";
        return false;
    }
}

, а затем украсьте модель вида этим атрибутом:

[Serializable]
[ValidateUser]
public class UserViewModel
{

}
0 голосов
/ 23 сентября 2011

Ваш синтаксис выглядит правильно.Проверка не «запускается» до тех пор, пока вы не попытаетесь подтвердить свою модель.Код вашего контроллера должен выглядеть следующим образом

[HttpPost]
public ActionResult Edit(UserViewModel user)
{
    if(ModelState.IsValid)
    {
        // at this point, `user` is valid
    }

    // since you always yield a new ValidationResult, your model shouldn't be valid
    return View(vm);
}
...