在录入数据时,对数据有效性的验证是必不可少的,如检查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
;
//
![](http://img.e-com-net.com/image/product/d55068b7eba0455eba2e81fccabd26f6.png)
..其他特殊处理
}
}
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/>
"
);
}
}
此代码只供于学习用,切勿模仿。后果自负。