實體驗證的作用簡單來講,就是從服務端對資料進行驗證。(特别是對資料安全性要求比較高的應用,這是十分必要的)
廢話不說了,直接講下使用步驟:(因為我是做web開發的,主要是講解asp.net環境中的使用)
1.先添加Microsoft.Practices.EnterpriseLibrary.Validation.dll的引用
2.最基本的使用方法(也是我最不喜歡的一種方式),直接在實體類上通過添加特性實作
實體類如下:
public class Person
{
[StringLengthValidator(2, 12, MessageTemplate = "請輸入2-12位長度的字元")]
public string Name
{
set;
get;
}
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "請輸入有效的Email位址")]
public string Email
}
該方式必須在原有代碼幾乎每個字段上都要修改,而且這種寫死的寫法比較暈(何況對于linq to sql這類東東,修改dbml後使用者所做的修改都會丢失)
3.然後就可以驗證了,代碼如下:
using System;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
protected void Page_Load(object sender, EventArgs e)
{
Person _p = new Person() { Name = "1", Email = "jimmy.yang#126.com" };
ValidationResults _results = Validation.Validate<Person>(_p);
if (!_results.IsValid)
foreach (ValidationResult vr in _results)
Response.Write(string.Format("錯誤位置:{0};原因:{1}<br>", vr.Key, vr.Message));
對于步驟2中提到的不便之處,幸好EnLib還提供了另一種方式,允許使用者把驗證規則放在配置檔案中,步驟如下:
(a)先在web.config上右擊,選擇Edit Enterprise Libaray Configuration

(b)建立一個Validataion Application Block
(c)new-->Type-->Load From File... 選擇實體類所在的DLL(如果實體類沒有分層構架,先把項目編譯一下,直接選擇項目bin目錄下的dll)
不過在使用過程中,發現一個bug:如果進行這一步前未編譯生成dll,或者進到這一步後,又修改了實體類,配置工具好象反射時,始終不能重新整理出最新的實體類,解決辦法:關掉vs,重新打開再選擇dll就正常了,不知道這是不是我機器上的個别現象
(d)new-->Rule Set --> new --> Choose Members-->選擇要驗證的成員
(e)添加驗證規則
(f)設定Person的預設規則
Ok了,這下所有驗證規則都被放到web.config中了,以下是web.config中的相關節點
<validation>
<type defaultRuleset="Rule Set" assemblyName="ValidateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="ValidateTest.Person">
<ruleset name="Rule Set">
<properties>
<property name="Name">
<validator negated="false" messageTemplate="請輸入名字" messageTemplateResourceName=""
messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator,
Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral"
name="Not Null Validator" />
<validator lowerBound="2" lowerBoundType="Ignore" upperBound="12"
upperBoundType="Inclusive" negated="false" messageTemplate="名字必須是2到12個字元"
messageTemplateResourceName="" messageTemplateResourceType=""
tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation,
Version=4.1.0.0, Culture=neutral"
name="String Length Validator" />
</property>
<property name="Email">
<validator pattern="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
options="None" patternResourceName="" patternResourceType=""
messageTemplate="請輸入有效的電子郵件位址" messageTemplateResourceName=""
messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RegexValidator,
name="Regex Validator" />
</properties>
</ruleset>
</type>
</validation>
以後要修改驗證規則,隻需要修改web.config即可,相對更靈活一些,但是這樣有一個問題,随着要驗證的類越來越多,web.config會越來越龐大,其實可以把驗證規則單獨放到另一個檔案裡,隻需要在web.config上做些修改即可,注意下面的高亮部分
<configuration>
<configSections>
<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral" />
</configSections>
<enterpriseLibrary.ConfigurationSource selectedSource="File Configuration Source">
<sources>
<add name="File Configuration Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common" filePath="config\validate.config"/>
</sources>
</enterpriseLibrary.ConfigurationSource>
上面第二段中的filePath=... 即表示把驗證規則放到config目錄下的validate.config中
接下來直接建立一個config目錄,然後把validate.config放在裡面就可以了,validate.config内容如下:
<configSections>
<section name="validation" type="Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValidationSettings, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral" />
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral" />
<validation>
messageTemplate="請輸入正确的電子郵件位址" messageTemplateResourceName=""
messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RegexValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral"
upperBoundType="Inclusive" negated="true" messageTemplate="名字長度為2-12個字元"
tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral"
</configuration>
最後再講一點廢話,QuickStarts中有一個關于asp.net的驗證示例,裡面的效果類似于正常的驗證控件,不過是要頁面送出後,由服務端再傳回的,個人覺得這樣效率太低,我傾向于先在頁面上做用戶端驗證并給出相關出錯提示,然後再到服務端代碼裡用文中所提的方法來驗證,是以這個示例涉及的内容就不準備研究了,大家有興趣的話,可以自行去look look這個例子