上一篇博客中,介绍了特性的验证的基本使用。上次演示的功能只是一个初级版,达不到在实际使用的要求。因为我们依旧有很多问题没有解决。这次我们就来一步步解决这些问题。
待解决的问题
至少需要解决两个问题,特性验证功能才能在实际的项目中应用。
1、有多个Model时,如果处理Model间的关系。
2、当我们有多个验证特性类时,如何处理验证特性类之间的关系。
有多个Model时,如果处理Model间的关系?
Model中现在只有一个方法是公有的,我们就用面向对象的思想,抽象出一个Model的父类,并将公用的代码提取到父类中。
ps:代码很简单,就不在贴出来了。文章的末尾会提供Demo的下载地址。
当我们有多个验证特性类时,如何处理验证特性类之间的关系?
除了验证的逻辑不一样,特性类中的属性都是公有的。也应该为特性类抽象出一个父类。
这样做的另一个原因是,我们属性上有多种特性验证时,可以将验证特性集合存入到父类中。调用时则调用子类具体的方法。
解决完上述两个问题后,再来添加两个验证的特性:
1、正则的验证。
2、数据库是否存在数据的验证。
正则的验证
1 [AttributeUsage(AttributeTargets.Property)] 2 public class RegexAttribute:ValidateAttibute 3 { 4 public string RegexStr { get; set; } 5 public RegexAttribute(string regexStr,string errorMessage) : base(errorMessage) 6 { 7 this.ErrorType=ValidateCode.RegexFailed; 8 this.RegexStr = regexStr; 9 } 10 11 public override bool Validate() 12 { 13 return Regex.IsMatch(this.InputValue.ToString(), this.RegexStr); 14 } 15 }
可以看到,正则的验证只是多了一个RegexStr属性用来保存正则表达式。正则表达式由调用者提供,这样做的好处就是增加了灵活性。不用为每种不同验证情况添加一个类。
数据库是否存在数据的验证
1 [AttributeUsage(AttributeTargets.Property)] 2 public class ExistAttribute:ValidateAttibute 3 { 4 private string _FiledName=null; 5 private string Conn { get; set; } 6 private string TableName { get; set; } 7 public ExistAttribute(string conn,string tableName,string filedName,string errorMessage) : base(errorMessage) 8 { 9 this._FiledName = filedName; 10 } 11 12 public override bool Validate() 13 { 14 return new BLL.CommonBll().IsExixt(this.Conn,this.TableName,this._FiledName, this.InputValue.ToString()); 15 } 16 }
数据库验证,可以验证这条数据是否已经在数据库中存在,当然也可以验证其他的逻辑。
查询的数据库,表名,字段也由调用者提供。这样保证了最大的灵活性。
下载地址
https://github.com/NemoChris/AttributeValidate/tree/v1.0