我尝试为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验证机制的明确信息。
在ASP中不支持IValidatableObject。NET 2.0。在ASP中添加了对该接口的支持。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
{
}
您的语法看起来正确。在您尝试验证模型之前,验证不会被"触发"。你的控制器代码应该像这样
[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);
}