驗證規則

範例程式碼下載(VB.NET 2008)

驗證規則程式碼片段下載(VB.NET)

前言

   一般開始接觸資料庫程式設計的人,大多會聽過這樣的至理名言:GIGO(Garbage In Garbage Out),也就是「輸入進去的是垃圾,那運算出來的結果也會是垃圾」,所以表單輸入時如何隨時驗證使用者輸入資料的正確性應該是資料庫應用程式的最基本要 求,不正確的資料絕對不允許儲存入資料庫。

  而之前的「CSLA.NET簡介」中,也曾提及CSLA.NET Framework簡化並標準化,在商業物件中的驗證(validation)邏輯的實作,而本文的目的正是要講解如何實作輸入驗證。

 說明

   在CSLA.NET基本功中, 所列出的13種基本模式,其中Editable與Dynamic開頭的商業物件,都牽涉到將來在使用者介面中讓使用者輸入資料的操作。既然跟輸入資料有 關,那就離不開輸入資料正確性的驗證。所以本文集中講解如何實作「驗證規則」的部分,將來讀者若有閱讀到CSLA.NET基本模式介紹的文章時,也可回頭 再參閱本文。

  在接下來的講解,會配合筆者所整理與「驗證規則」有關的程式碼片段做說明,所以請讀者先行下載程式碼片段,並請參閱「使用自訂程式碼片段」將程式碼片段匯入到您的開發環境中。如果成功地匯入,將可在程式碼編輯器中按滑鼠右鍵,並選擇「插入程式碼片段(I)...」,可出現如下之選項供選擇合適的程式碼片段。



實作說明

  請打開所下載的範例程式,並開啟在BusinessLogic專案中的BusinessObject.vb這個類別程式。(本範例也是使用三層式架構的方式,讀者若不明白,請參閱「專案分離」,或「NameValueList」)

 
 

  此次欲說明的程式碼,只與「驗證規則」區段的程式碼有關,而「商業方法」區段的程式碼是定義商業物件對外開放可供,讀、寫的欄位(Public Property) 。為了方便說明,所以只放了:一個數值、一個文字、兩個日期的欄位。而這些對外公開的欄位(公用屬性)的寫法將會於另一篇文章中討論。

  而在寫在「驗證規則」區段的部分是本次文章的重點,此區段是放些對於欄位輸入時所需檢查的驗證規則。接下來將會配合程式碼片段,並一一說明欲對某個欄位做輸入檢驗時該如何實作。

驗證規則程式碼位置


 

   如上圖所示,驗證規則所需放置的為置為:「Protected Overrides Sub AddBusinessRules()」與「End Sub」之間。而紅色方框所框住的代表一項驗證規則。接下來會以實際的例子,來解說如何因應需要為自己的程式加入驗證規則。

通用驗證規則

  •  字串不可空白


      假設有個字串型欄位(本例是Name),要求使用者一定要輸入,則可使用「插入Csla字串不可空白驗證」。



      插入程式碼片段後,必須因情況而改變的地方會以反白出現,且當滑鼠靠近該反白的區域,會出現提示。以本例是指明那一個欄位(屬性名稱)該做不可空白檢驗。
     
  • 字串最大(小)長度驗證
      有時候,會因某些因素必須限制某個欄位輸入長度要在某個範圍之內(或必須超過某個長度),則可使用「插入Csla字串最大長度驗證」(「插入Csla字串最大長度驗證」)





      同樣地插入程式碼片段後,必須改變的地方也是會反白,這次除了指明那一個欄位(屬性名稱)該做驗證外,還要指明驗證的字數。
     
  • 最大(小)整數值
      對於數值方面,有時也會要求使用者不可輸入大於(或小於)某數值,例如「建議售價」不可小於0 。對於數值的驗證可使用「插入Csla最大整數值驗證」(「插入Csla最小整數值驗證」)





      同樣地插入程式碼片段後,必須改變的地方也是會反白,這次除了指明那一個欄位(屬性名稱)該做驗證外,還要指明數值的大小。

 

自訂驗證規則

  • 單一驗證規則
      除了前述的通用驗證規則外,有時對一個欄位的輸入檢查,並不是只有單純地檢查是否在某個數值範圍內。有時針對企業特定的邏輯,會有特定的檢查規定。比如:當出貨量大於庫存量是不允許出貨,因此在出貨量的欄位輸入時就該檢查所輸入的值是否小於等於庫存量。
      此時可使用「插入Csla自訂驗證」首先指明那一個欄位要接受驗證,並指明使用那一個自訂函數做驗證。再使用「插入Csla自訂驗證函數區段」,和實作自己的驗證規則。
      本範例是以限制輸入建議售價時不可包含「4」的數字,而實際的規則就該看所開發的應用程式需要而定。

    Protected Overrides Sub AddBusinessRules()
        ' TODO: 加入驗證規則

        ValidationRules.AddRule(Of BusinessObject)(AddressOf NoFour(Of BusinessObject), SuggestPriceProperty)

      End Sub

      Private Shared Function NoFour(Of T As BusinessObject)( _
        ByVal target As T, _
        ByVal e As Validation.RuleArgs) As Boolean
        If target.GetProperty(Of Integer)(SuggestPriceProperty).ToString.Contains("4") Then
          e.Description = "建議售價不可有「四」!"
          Return False
        End If
        Return True
      End Function

  • 兩屬性關聯
       有時在一個表單上會有兩個欄位是相互有關聯的,當一個欄位的值變動了,另一個欄位就該重新驗證。比如:有一張表單上有「開始日期」「結束日期」,而「開 始日期」必定是小於「結束日期」才合理。在當使用者在輸入表單時,只要輸入了其中一個日期,除了檢查目前所輸入的這個日期外,另一個日期也必須一起檢查是 否合理。
      因此除了使用「插入Csla自訂驗證」指定要接受驗證的各個欄位,及使用那一個自訂函數做驗證,並用「插入Csla自訂驗證函數區段」實作自己的驗證規則外,還要使用「插入Csla兩屬性關聯」指明那兩個屬性是相互有關聯的。

     Protected Overrides Sub AddBusinessRules()
        ' TODO: 加入驗證規則

        ValidationRules.AddRule(Of BusinessObject)(AddressOf StartDateGTEndDate(Of BusinessObject), StartedProperty)
        ValidationRules.AddRule(Of BusinessObject)(AddressOf StartDateGTEndDate(Of BusinessObject), EndedProperty)
        ValidationRules.AddDependentProperty(StartedProperty, EndedProperty, True)

      End Sub

      Private Shared Function StartDateGTEndDate(Of T As BusinessObject)( _
        ByVal target As T, _
        ByVal e As Validation.RuleArgs) As Boolean
        If target.GetProperty(Of SmartDate)(StartedProperty) > target.GetProperty(Of SmartDate)(EndedProperty) Then
          e.Description = "開始日期不可大於結束日期!"
          Return False
        End If
        Return True
      End Function

使用者介面

  接下來就是如何在使用者介面上使用。

  • Windows Form
      在Windows Form上使用,首先請參閱之前「資料繫結」的文章,將各個輸入欄位,拉入表單(Form)中,而為了讓使用者在輸入的過程當中,隨時提醒使用者那個欄位違反了那個驗證規則,請再拉入一個ErrorProvider控制項,並指定其DataSource為物件的DataBindingSource



      接著請直接執行程式,將可發現輸入欄位已經有了驗證的功能,且當輸入違反了驗證規則時,在輸入欄位的右邊會出現一個紅色驚嘆號的圓球,且當滑鼠靠近該圓球時會出現錯誤訊息。


     

結言

   本篇文章只針對於資料輸入時的驗證規則實作的介紹,配合上述的通用及自訂的驗證規則,應該可以很容易實作出各種情況且複雜的驗證規則。而使用 CSLA.NET Framework可簡化、標準化驗證規則的實作,因此將來應用程式開發時只須將心力集在中於系統分析時,確實分析出表單中應該要有那些驗證,剩下來就是 使用合適的程式碼片段,及實作自訂的驗證函數。

  由於本篇文章只針對於資料輸入時的驗證規則實作的介紹,因此在範例的商業物件中有許多 程式碼都省略而沒有實作出來,但是讀者應該能發現,就算商業物件還沒有完全實作完,對於使用者介面的製作並沒有妨礙。事實上商業物件只要接受資料輸入的屬 性部分完成後(此部分有可能使用程式產生器自動產生)即可交由使用者介面設計人員設計介面了,而將來等商業物件完全設計好,使用者介面程式也不須要再重新 編譯,只要換掉商業類別的組件檔(.dll)即可。

  在此,再度強調商業邏輯(Business Logic)與使用者介面(User Interface)分離的設計方式的好處,不僅是往後程式維護容易,更方便協同作業,讓各有專長的人負責各自專長的部分。


posted on 2008/4/21 20:46 | 我要推薦 | 閱讀數 : 534 | 文章分類 [ CSLA.NET-綜合議題 ] 訂閱

Comments on this entry:

目前沒有回應.

回應:

標題:
姓名:
電子郵件: (將不會被顯示)
個人網頁:
 
 
Please add 3 and 3 and type the answer here: