摘要:也许大家都已经习惯了使用ASP.NET中的验证控件进行数据有效性的验证,但是验证控件的验证无法与我们的自定义的实体类结合起来,两者属于不同层面的验证。在Enterprise Library 3.0中有了Validation Application Block,可以轻松的实现页面验证与类验证的结合。
1.编写实体类,本文我使用Enterprise Library 3.0 QuickStarts中的例子,采用Atteribute验证的方式(采用配置文件来实现也是一样的),分别设置验证规则集合、错误信息提示等属性,代码如下:
public
class
Customer
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
private string firstName;
private string lastName;
private DateTime dateOfBirth;
private string email;
private int rewardPoints;
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[StringLengthValidator(1, 50, Ruleset = "RuleSetA", MessageTemplate="First Name must be between 1 and 50 characters long")]
public string FirstName
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return firstName; }
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ firstName = value; }
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[StringLengthValidator(1, 50, Ruleset = "RuleSetA", MessageTemplate = "Last Name must be between 1 and 50 characters long")]
public string LastName
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return lastName; }
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ lastName = value; }
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[RelativeDateTimeValidator(-120, DateTimeUnit.Year, -18, DateTimeUnit.Year, Ruleset = "RuleSetA", MessageTemplate="Must be 18 years old")]
public DateTime DateOfBirth
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return dateOfBirth; }
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ dateOfBirth = value; }
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", Ruleset = "RuleSetA")]
public string Email
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return email; }
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ email = value; }
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[Int32RangeValidator(0, 1000000, Ruleset = "RuleSetA", MessageTemplate = "Rewards points cannot exceed 1,000,000")]
public int RewardPoints
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return rewardPoints; }
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ rewardPoints = value; }
}
}
2.添加PropertyProxyValidator控件。在工具箱中添加新项,选择Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet,默认的安装路径为C:\Program Files\Microsoft Enterprise Library 3.0 - January 2007 CTP\Bin,添加完成后可以在工具箱中看到PropertyProxyValidator控件。
3.编写ASPX页面,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/efd186a291ae841f3c5436d4a0854f7e.gif)
代码如下:
<
div
>
<
h3
>
Validation Application Block: ASP.NET Integration QuickStart
</
h3
>
<
table
>
<
tr
>
<
td
style
="width: 100px"
>
First Name:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="firstNameTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
>
<
br
/>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px; height: 21px"
>
Last Name:
</
td
>
<
td
style
="width: 508px; height: 21px"
>
<
asp:TextBox
ID
="lastNameTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
><
br
/>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
Date Of Birth:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="dateOfBirthTextBox"
runat
="server"
></
asp:TextBox
><
br
/>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
E-mail:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="emailTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
><
br
/>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px; height: 25px;"
>
Rewards Points:
</
td
>
<
td
style
="width: 508px; height: 25px;"
>
<
asp:TextBox
ID
="rewardsPointsTextBox"
runat
="server"
></
asp:TextBox
><
br
/>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
</
td
>
<
td
style
="width: 508px"
>
<
asp:Button
ID
="submitButton"
runat
="server"
Text
="Submit"
OnClick
="submitButton_Click"
/>
<
asp:Label
ID
="validationResultsLabel"
runat
="server"
></
asp:Label
></
td
>
</
tr
>
</
table
>
</
div
>
4.在页面上需要验证的地方添加PropertyProxyValidator控件,基本的属性设置如下:
<
cc1:propertyproxyvalidator
id
="firstNameValidator"
runat
="server"
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ControlToValidate
="ContolToValidate"
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
PropertyName
="PropertyName"
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RulesetName
="RuleSetName"
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SourceTypeName
="ValidationAspNetQuickStart.Customer"
>
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
cc1:propertyproxyvalidator
>
其中ControlToValidate指定对应的需要验证的控件ID,PropertyName指定在实体类中的属性名,RulesetName指定验证规则的名称,SourceTypeName指定实体类型名,当然了你也可以像验证控件一样通过Display属性来指定验证信息的显示方式:None、Static、Dynamic。PropertyProxyValidator还有一个很重要的事件OnValueConvert,在事件可以通过做类型转换根据是否抛出异常来判断输入是否正确,以及设置验证提示信息等。添加完PropertyProxyValidator后代码如下:
<
div
>
<
h1
>
Validation Application Block: ASP.NET Integration QuickStart
</
h1
>
<
table
>
<
tr
>
<
td
style
="width: 100px"
>
First Name:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="firstNameTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
>
<
br
/>
<
cc1:propertyproxyvalidator
id
="firstNameValidator"
runat
="server"
ControlToValidate
="firstN
ameTextBox"
PropertyName
="FirstName"
RulesetName
="RuleSetA"
SourceTypeName
="ValidationAspNetQuickStart.Customer"
>
</
cc1:propertyproxyvalidator
>
</
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px; height: 21px"
>
Last Name:
</
td
>
<
td
style
="width: 508px; height: 21px"
>
<
asp:TextBox
ID
="lastNameTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
><
br
/>
<
cc1:PropertyProxyValidator
ID
="lastNameValidator"
runat
="server"
ControlToValidate
="lastNameTextBox"
PropertyName
="LastName"
RulesetName
="RuleSetA"
SourceTypeName
="ValidationAspNetQuickStart.Customer"
></
cc1:PropertyProxyValidator
></
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
Date Of Birth:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="dateOfBirthTextBox"
runat
="server"
></
asp:TextBox
><
br
/>
<
cc1:PropertyProxyValidator
ID
="dateOfBirthValidator"
runat
="server"
ControlToValidate
="dateOfBirthTextBox"
OnValueConvert
="dateOfBirthValidator_ValueConvert"
PropertyName
="DateOfBirth"
RulesetName
="RuleSetA"
SourceTypeName
="ValidationAspNetQuickStart.Customer"
></
cc1:PropertyProxyValidator
></
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
E-mail:
</
td
>
<
td
style
="width: 508px"
>
<
asp:TextBox
ID
="emailTextBox"
runat
="server"
Width
="235px"
></
asp:TextBox
><
br
/>
<
cc1:PropertyProxyValidator
ID
="emailValidator"
runat
="server"
ControlToValidate
="emailTextBox"
PropertyName
="Email"
RulesetName
="RuleSetA"
SourceTypeName
="ValidationAspNetQuickStart.Customer"
></
cc1:PropertyProxyValidator
></
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px; height: 25px;"
>
Rewards Points:
</
td
>
<
td
style
="width: 508px; height: 25px;"
>
<
asp:TextBox
ID
="rewardsPointsTextBox"
runat
="server"
></
asp:TextBox
><
br
/>
<
cc1:PropertyProxyValidator
ID
="rewardPointsValidator"
runat
="server"
ControlToValidate
="rewardsPointsTextBox"
PropertyName
="RewardPoints"
RulesetName
="RuleSetA"
SourceTypeName
="ValidationAspNetQuickStart.Customer"
OnValueConvert
="rewardsPointsValidator_ValueConvert"
></
cc1:PropertyProxyValidator
></
td
>
</
tr
>
<
tr
>
<
td
style
="width: 100px"
>
</
td
>
<
td
style
="width: 508px"
>
<
asp:Button
ID
="submitButton"
runat
="server"
Text
="Submit"
OnClick
="submitButton_Click"
/>
<
asp:Label
ID
="validationResultsLabel"
runat
="server"
></
asp:Label
></
td
>
</
tr
>
</
table
>
</
div
>
5.在这里有两个验证器用到了OnValueConvert事件,对应的CS代码如下:
protected
void
rewardsPointsValidator_ValueConvert(
object
sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
string value = e.ValueToConvert as string;
try
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.ConvertedValue = Int32.Parse(value);
}
catch
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.ConversionErrorMessage = "Rewards points is not a valid integer";
e.ConvertedValue = null;
}
}
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
protected
void
dateOfBirthValidator_ValueConvert(
object
sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
string value = e.ValueToConvert as string;
try
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.ConvertedValue = DateTime.Parse(value, System.Globalization.CultureInfo.CurrentCulture);
}
catch
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.ConversionErrorMessage = "Date Of Birth is not in the correct format.";
e.ConvertedValue = null;
}
}
6.运行后,输入错误的数据如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/6413c41776aa095c899361087fb8b6a3.gif)
关于Validation Application Block与ASP.NET的集成就简单得介绍到这儿。
注意本文使用的版本是Enterprise Library 3.0 January 2007 CTP版本。