我尝试为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验证机制的明确信息。
答案 0 :(得分:3)
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);
}