前几天突然想写写看利用ModelState的验证方式。自己来写几个验证特性。先上代码
public class StringAttribute : ValidationAttribute { /// <summary> /// 验证规则 /// </summary> public string ValidateValue { get; set; } /// <summary> /// 数据验证 /// </summary> /// <param name="value"></param> /// <param name="validationContext"></param> /// <returns></returns> protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if ((string)value == ValidateValue)//判断是否符合验证规则 { return ValidationResult.Success; } else { var result = new ValidationResult("error");//返回一个包含错误提示的结果 return result; } } public override bool IsValid(object value) { return base.IsValid(value); } }
自己写着玩的,比较简单。写自己的验证特性必须继承ValidationAttribute。
其中可以通过重写IsValid的两个重载方法来实现自己的验证规则。IsValid有两个参数。value是需要验证的值,ValidationContext是一个验证的上下文对象。ValidationContext中包含需要验证的成员名称MemberName和DisplayName,还有ObjectInstance验证对象和ObjectType对象类型。
我自己定义了一个ValidateValue字段,用来表示验证规则。
如果验证失败,就返回一个新的ValidationResult对象。ValidationResult包含一个ErrorMessage错误信息用于显示,MemberNames验证结果有误的成员名称集合。
ErrorMessage错误信息可以自己定义,也可以用占位符{DisplayName}将错误的成员名称显示出来。
这只是简单的验证单个字段,经常我们会遇到同一个对象中需要另一个字段来验证每个字段。
在这里也可以实现,需要利用反射的方式来实现。
先上代码来看看如何实现。
public class StringAttribute : ValidationAttribute { /// <summary> /// 验证规则 /// </summary> public string ValidateValue { get; set; } /// <summary> /// 帮助验证的其他字段 /// </summary> public string OtherpProtery { get; set; } /// <summary> /// 数据验证 /// </summary> /// <param name="value"></param> /// <param name="validationContext"></param> /// <returns></returns> protected override ValidationResult IsValid(object value, ValidationContext validationContext) { //用反射获取用户输入的值 PropertyInfo property = validationContext.ObjectType.GetProperty(OtherpProtery); var values = property.GetValue(validationContext.ObjectInstance); if ((string)values == value)//判断是否符合验证规则 { return ValidationResult.Success; } else { var result = new ValidationResult("error");//返回一个包含错误提示的结果 return result; } } public override bool IsValid(object value) { return base.IsValid(value); } }
新增加了一个OtherpProtery属性,它用来保存其他的成员名。然后通过
//用反射获取用户输入的值
PropertyInfo property = validationContext.ObjectType.GetProperty(OtherpProtery);
var values = property.GetValue(validationContext.ObjectInstance);
来取出其他属性中用户输入的值。与当前成员的进行验证比较。比如像是用户注册需要输入两次密码是否一致。
有错误的地方希望大牛们指出,表喷我