Castle自定义数据验证

    在录入数据时,对数据有效性的验证是必不可少的,如检查Email,电话号码等。在Castle里面已经自带了几个常用的验证。那如何自定义一个数据的有效性验证呢?
    窈窕淑女,君子好逑。心爱的人结婚了,可新郎不是我。人家的结婚证上写着的是另一个男人的名字。我们又未尝不想天下的美女都是自己的情人呢。(小孩子不要看这些。带坏人来的。)。那我们要改下结婚事务所的那个系统。如果是女的,且是美女,那配偶就是……,感觉有点无赖。
创建数据库表:

CREATE   TABLE   [ dbo ] . [ People ] (
 
[ ID ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL   PRIMARY   KEY ,
 
[ Name ]   [ nvarchar ] ( 50 ) COLLATE Chinese_Taiwan_Stroke_CI_AS  NULL ,
 
[ Sex ]   [ varchar ] ( 1 ) COLLATE Chinese_Taiwan_Stroke_CI_AS  NULL ,
 
[ Beautiful ]   [ varchar ] ( 1 ) COLLATE Chinese_Taiwan_Stroke_CI_AS  NULL ,
 
[ Mate ]   [ nvarchar ] ( 100 ) COLLATE Chinese_Taiwan_Stroke_CI_AS  NULL
)


创建实体类。

using  Castle.ActiveRecord;
using  Castle.Components.Validator;

[ActiveRecord(
" People " )]
public   class  Person:ActiveRecordValidationBase < Person >
{
    
private   int  _id;
    
private   string  _name;
    
private  SexType _sex;
    
private  BeautifulType _beautiful;
    
private   string  _mate;


    
///   <summary>
    
///  省份证件
    
///   </summary>
    [PrimaryKey(PrimaryKeyType.Identity,Column = " ID " ),ValidateNonEmpty]
    
public   int  ID
    {
        
set  { _id  =  value; }
        
get  {  return  _id;}
    }

    
///   <summary>
    
///  名字
    
///   </summary>
    [Property( " Name " ,SqlType = " nvarchar(50) " ),ValidateNonEmpty]
    
public   string  Name
    {
        
set  { _name  =  value; }
        
get  {  return  _name; }
    }

    
///   <summary>
    
///  性别
    
///   </summary>
    [Property( " Sex " ,SqlType = " varchar " ),ValidateNonEmpty]
    
public  SexType Sex
    {
        
set  { _sex  =  value; }
        
get  {  return  _sex; }
    }

    
///   <summary>
    
///  美女、猛男?
    
///   </summary>
    [Property( " Beautiful " ,SqlType = " varchar " )]
    
public  BeautifulType Beautiful
    {
        
set  { _beautiful  =  value; }
        
get  {  return  _beautiful; }
    }

    
///   <summary>
    
///  配偶
    
///   </summary>
    [Property( " Mate " , SqlType  =   " nvarchar(100) " )]
    
public   string  Meta
    {
        
set  { _mate  =  value; }
        
get  {  return  _mate;}
    }
}

public   enum  SexType
{
    
///   <summary>
    
///  女
    
///   </summary>
    Female = 1 ,
    
///   <summary>
    
///  男
    
///   </summary>
    Male = 2
}

public   enum  BeautifulType
{
    
///   <summary>
    
///  美丽或COOL
    
///   </summary>
    Yes = 1 ,
    
///   <summary>
    
///  恐龙
    
///   </summary>
    No = 2
}

 

这些验证属性都是从AbstractValidationAttribute继承来的,可右键--转到定义 查看。那么新建一个类。命名为ValidateMateAttribute,继承AbstractValidationAttribute,并实现public override IValidator Build()方法。

 

using  Castle.Components.Validator;

///   <summary>
///  配偶验证
///   </summary>
public   class  ValidateMateAttribute:AbstractValidationAttribute
{
    
///   <summary>
    
///  错误信息
    
///   </summary>
    
///   <param name="_errorMessage"></param>
     public  ValidateMateAttribute( string  _errorMessage)
        : 
base (_errorMessage)
    { }

    
public   override  IValidator Build()
    {
        
// 呆会实现……
  return   null ;
    }
}

 


这个方法返回IValidator类型,查看此接口,此接口定义了验证需要实现的方法等。我们可不必直接继承,我们可继承它的一个子类AbstractValidator。那么在新建一个ValidateMate类,继承using using Castle.Components.Validator;

 

///   <summary>
///  配偶验证
///   </summary>
public   class  ValidateMate:AbstractValidator
{
    
private   string  _mateName;
    
///   <summary>
    
///  配偶验证
    
///   </summary>
    
///   <param name="_mateName"> 配偶名字 </param>
     public  ValidateMate( string  _mateName)
    {
        
this ._mateName  =  _mateName;
    }

    
public   override   bool  IsValid( object  instance,  object  fieldValue)
    {
        Person p 
=  instance  as  Person;
        
if  (p  !=   null )
        {
            
string  mate  =  fieldValue  as   string ;
            
if  (mate  !=   null )
            {
                
if  (p.Sex  ==  SexType.Female  &&  p.Beautiful  ==  BeautifulType.Yes) // 如果是女的,且是美女……
                     if  (mate.ToLower()  !=  _mateName.ToLower())
                        
return   false ;
  
// ..其他特殊处理
            }
        }
        
return   true ;
    }

    
public   override   bool  SupportsBrowserValidation
    {
        
get  {  return   true ; }
    }
}


回到ValidateMateAttribute类,实现Build方法。

 

using  Castle.Components.Validator;

///   <summary>
///  配偶验证
///   </summary>
public   class  ValidateMateAttribute:AbstractValidationAttribute
{
    
private   string  _mateName;
    
///   <summary>
    
///  配偶名字
    
///   </summary>
     public   string  MateName
    {
        
get  {  return  _mateName; }
        
set  { _mateName  =  value; }
    }

    
///   <summary>
    
///  错误信息
    
///   </summary>
    
///   <param name="_mateName"> 配偶名字 </param>
    
///   <param name="_errorMessage"> 错误信息 </param>
     public  ValidateMateAttribute( string  _mateName, string  _errorMessage)
        : 
base (_errorMessage)
    {
        
this ._mateName  =  _mateName;
    }

    
public   override  IValidator Build()
    {
        ValidateMate val 
=   new  ValidateMate(_mateName);
        ConfigureValidatorMessage(val);
        
return  val;
    }
}


那现在赶紧更新实体类的如下代码

     ///   <summary>
    
///  配偶
    
///   </summary>
    [Property( " Mate " , SqlType  =   " nvarchar(100) " ),ValidateMate( " asheng " , " 有情人终…… " )]
    
public   string  Meta
    {
        
set  { _mate  =  value; }
        
get  {  return  _mate;}
    }

 

那么现在测试下。

 

       Person p  =   new  Person();
        p.Sex 
=  SexType.Female;
        p.Name 
=   " Aiguo " ;
        p.Beautiful 
=  BeautifulType.Yes;
        p.Meta 
=   " ASheng " ;
        p.IsValid();
        
foreach  (ArrayList var  in  p.PropertiesValidationErrorMessage.Values)
        {
            
foreach  ( string  str  in  var)
            {
                Response.Write(str 
+   " <br/> " );
            }
        }

 此代码只供于学习用,切勿模仿。后果自负。

你可能感兴趣的:(cast)