2. IValidatableObject
自验证模型是指一个知道如何验证自身的模型对象。一个模型对象可以通过实现IValidatableObject接口来实现对自身的验证。
public class Order : IValidatableObject { public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if(LastName != null && LastName.Split(' ').Length > 10) { yield return new ValidationResult("The last name has too many words!", new []{"LastName"}); } } }
这种方式与特性版本有几个明显的不同点:
- MVC运行时为执行验证而调用的方法名称是Validate而不是IsValid,但更重要的是,它们的返回类型和参数也不同。
- Validate的返回类型是IEnumerable<ValidationResult>,而不是单独的ValidationResult对象。因为从表面上看,内部的验证逻辑验证的是整个模型,因此可能返回多个验证错误。
- 这里没有value参数传递给Validate犯法,因为在此Validate是一个模型实例方法,在其内部可以直接访问当前模型对象的属性值。