首页 > 代码库 > mvc model验证

mvc model验证

前几天突然想写写看利用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 =http://www.mamicode.com/= 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);        }    }
View Code

新增加了一个OtherpProtery属性,它用来保存其他的成员名。然后通过

//用反射获取用户输入的值
PropertyInfo property = validationContext.ObjectType.GetProperty(OtherpProtery);
var values = property.GetValue(validationContext.ObjectInstance);

来取出其他属性中用户输入的值。与当前成员的进行验证比较。比如像是用户注册需要输入两次密码是否一致。

 有错误的地方希望大牛们指出,表喷我