基于特性验证(完结)

    上一篇博客中,介绍了特性的验证的基本使用。上次演示的功能只是一个初级版,达不到在实际使用的要求。因为我们依旧有很多问题没有解决。这次我们就来一步步解决这些问题。

 

待解决的问题

    至少需要解决两个问题,特性验证功能才能在实际的项目中应用。
    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

 
    
posted @ 2015-10-29 21:02  AfreadHuang  阅读(758)  评论(0编辑  收藏  举报