如何为viewmodel添加自定义验证方法

时间:2011-09-23 13:07:27

标签: asp.net validation asp.net-mvc-2 viewmodel

我尝试为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 个答案:

答案 0 :(得分:3)

ASP.NET 2.0不支持

IValidatableObject。 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
{

}

答案 1 :(得分:0)

您的语法看起来正确。在您尝试验证模型之前,验证不会“触发”。您的控制器代码应如下所示

[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);
}