自定义服务端验证要继承自ValidationAttribute,并重写IsValid虚方法来自定义自己的验证规则,ValidationAttribute源码如下:
1 public abstract class ValidationAttribute : Attribute 2 { 3 //验证失败提示消息 4 public virtual string FormatErrorMessage(string name); 5 6 //自定义验证一 7 protected virtual ValidationResult IsValid(object value, ValidationContext validationContext); 8 9 //自定义验证二 10 public virtual bool IsValid(object value); 11 }
参考系统实例:
public class Link { [Required] [DisplayName("文字")] public string Text { get; set; } [Url] [Required] [DisplayName("Url链接")] public string Url { get; set; } }
1 public class UrlAttribute : ValidationAttribute,IClientValidatable 2 { 3 public override string FormatErrorMessage(string name) 4 { 5 return string.Format("{0}格式有误", name); 6 } 7 8 public UrlAttribute() 9 { 10 } 11 12 public override bool IsValid(object value) 13 { 14 var text = value as string; 15 Uri uri; 16 17 return (!string.IsNullOrWhiteSpace(text) && Uri.TryCreate(text, UriKind.Absolute, out uri)); 18 } 19 20 public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 21 { 22 var validationRule = new ModelClientValidationRule 23 { 24 ErrorMessage = FormatErrorMessage(metadata.DisplayName), 25 ValidationType = "url", 26 }; 27 28 yield return validationRule; 29 } 30 }
UrlAttribute实现服务端和客户端的验证,客户端我们只是为input控件添加data-val-url属性,但他的客户端验证还是有效的,因为validate这个插件已经实现它的js验证脚本。
IValidatableObject接口实现Model数据验证
如果在自定义的业务逻辑中,获取到当前类的其他字典。。。
因为验证逻辑需要根据当前model的多个字段来综合判断。
实现起来很简单,需要model继承IValidatableObject接口
public class Student : IValidatableObject { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Age % 2 == 0) { var result = new ValidationResult("年龄的验证有问题",new string[]{"Age"}); yield return result; } } }