天天看點

Enterprise Library 4.1學習筆記5----實體驗證程式塊

實體驗證的作用簡單來講,就是從服務端對資料進行驗證。(特别是對資料安全性要求比較高的應用,這是十分必要的)

廢話不說了,直接講下使用步驟:(因為我是做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

Enterprise Library 4.1學習筆記5----實體驗證程式塊

(b)建立一個Validataion Application Block

Enterprise Library 4.1學習筆記5----實體驗證程式塊

(c)new-->Type-->Load From File... 選擇實體類所在的DLL(如果實體類沒有分層構架,先把項目編譯一下,直接選擇項目bin目錄下的dll)

不過在使用過程中,發現一個bug:如果進行這一步前未編譯生成dll,或者進到這一步後,又修改了實體類,配置工具好象反射時,始終不能重新整理出最新的實體類,解決辦法:關掉vs,重新打開再選擇dll就正常了,不知道這是不是我機器上的個别現象

Enterprise Library 4.1學習筆記5----實體驗證程式塊
Enterprise Library 4.1學習筆記5----實體驗證程式塊

(d)new-->Rule Set --> new --> Choose Members-->選擇要驗證的成員

Enterprise Library 4.1學習筆記5----實體驗證程式塊

(e)添加驗證規則

Enterprise Library 4.1學習筆記5----實體驗證程式塊

(f)設定Person的預設規則

Enterprise Library 4.1學習筆記5----實體驗證程式塊

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" />

Enterprise Library 4.1學習筆記5----實體驗證程式塊

  </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>

Enterprise Library 4.1學習筆記5----實體驗證程式塊

上面第二段中的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這個例子