2012-03-01 118 views
2

我有一個3層的演示文稿,邏輯和數據訪問系統。在我的邏輯層中,我有一個Validate()方法,用於確保即將轉發到數據訪問層的數據對數據庫有效(沒有空值,不允許空值,等等)。任何更好的方式來處理用戶輸入驗證?

最重要的是,在.aspx表示層中,我們有一些用戶友好的錯誤檢查和驗證,直接檢查Web窗體上的控件。我的問題是代碼背後的ValidateInput()方法檢查控件,它有幾百行長,真的很煩人。用於檢查數據的代碼遠遠長於實際工作的代碼。

我得看起來像這樣:

 private List<string> ValidateInput() 
     { 
      List<string> errormessages = new List<string>(); 

      if (LastNameETextBox.Text.Trim() == String.Empty) 
      { 
       errormessages.Add("Last name required."); 
      } 

      if (FirstNameETextBox.Text.Trim() == String.Empty) 
      { 
       errormessages.Add("First name required."); 
      } 

      //etc. etc. 
     } 

我們隱藏在母版頁一個漂亮的風格的通知框,會從上可見的僞變成真的,當我們調用它,創造了「幻覺」一個重疊的盒子。它看起來非常好,工作得很好,所以我們想要使用它。我們的想法是,我們收集整個表單的所有錯誤,將它們放在一個列表中,然後將該列表發送到通知框,然後在一個不錯的列表中給出所有錯誤。

但Validate()只是一個「if」語句的折磨量,很難跟蹤。這只是輸入驗證的本質,還是有其他更好的方法來處理這個問題?

回答

4

我認爲你可以避免使用這種使用通用函數的If語句。 我的建議是這樣定義

private List<string> ValidateInput(string ErrorMessage, TextBox txtInput, ValidatationType validationType) 
{ 
    List<string> errormessages = new List<string>(); 


    if (validatationType == ValidationType.NoNullValues) 
    { 

     if (txtInput.Text.Equals(String.Empty)) 
      { 
       errormessages.Add(ErrorMessage); 
      } 

    } 

    if (validatationType == ValidationType.Integer) 
    { 

     int number; 
     if (Int32.TryParse(value, out number)) 
     { 
      errormessages.Add(ErrorMessage); 
     } 

    } 

    // etc. etc. 
} 

枚舉ValidationType

enum ValidationType 
{ 
    NoNullValues, 
    Integer, 
    // etc 
} 

功能請修改功能。還檢查語法,我使用記事本來編寫代碼。 如果您在單獨的課程中使用所有驗證方法,此方法還可以幫助您實現可重用性。

感謝

+0

啊,我明白你在那裏做什麼。謝謝!這絕對是我現在擁有的改進。 – CptSupermrkt 2012-03-01 06:50:09

+0

如果您滿意請接受答案:) – kbvishnu 2012-03-01 06:52:28

0

情侶的,我已經處理它(在不同的項目)的不同方法:

  1. 使用自定義的控件庫 - 對照簡單地擴展現有ASP.NET/3rd黨控件添加由諸如IsMandatory,MandatoryMessage等屬性控制的驗證邏輯。屬性通常在設計時設置(並且不被視圖狀態支持)。驗證邏輯會在基本頁面公開的消息集合中累積錯誤消息。另一個變體使用了將ASP.NET控件和驗證器結合在一起的用戶控件,但坦率地說,ASP.NET驗證器很糟糕。

  2. 本質上,基頁面類具有驗證邏輯,該驗證邏輯將遍歷頁面內的控件集合,然後根據控件類型執行驗證。該頁面將提供一個註冊表來註冊要驗證的控件,驗證類型和要顯示的錯誤消息。還有一種方法是取消註冊/跳過控制驗證,該驗證主要用於在諸如中繼器/網格視圖之類的控制內跳過控制遍歷。

對於客戶端(瀏覽器端)驗證,我曾使用jquery validation(或自己的JS庫)。在上述兩種情況下,驗證邏輯還會發出必要的啓動腳本來設置客戶端驗證 - 但是,#2可能會生成一個啓動腳本(具有較小的大小),而#1需要生成一個啓動每個控件實例的啓動腳本。從靈活性角度來看,#1更好,並且非常適合基於控制的開發方法。 #2將您的驗證邏輯集中在一個可以非常方便的中心位置(即基本頁面)。

0

a)創建一個驗證類型枚舉來枚舉要執行的所有類型的驗證。 (在你的代碼中,你正在對兩個控件都進行字符串null檢查,這兩個控件都是文本框,它不必重複代碼邏輯) b)創建一個包含所有錯誤消息的常量/資源文件類。 c)編寫一個接受控制的函數,驗證類型枚舉,用於驗證的參數和錯誤消息ID。它將檢查控件的類型並執行enum指示的驗證。如果錯誤,則將錯誤消息添加到「errorMessages」集合中。

enum ValidationType{ 
    NullCheck, 
    IsNumber, 
    RangeCheck, 
    .... 
} 

class ErrorMessages{ 
    const string FNEMPTY = "First Name is empty"; 
    .... 
} 

class BusinessObject{ 
    function ValidateControl(Control cntrl, ValidationType type, object[] args, string message) 
    { 
     if(cntrl is TextBox) 
     { 
      if(cntrl as TextBox).Text.Trim() == String.Empty 
        errorMessages.Add(message); 
     } 
     ... 
    } 
} 

現在,您可以在要驗證的每個控件上調用上述函數。還有一項改進是爲所有控件實現一個基類,該基類在屬性(Dictionary<ValidationType,String>)中包含相應的錯誤消息集合。然後,您可以修改驗證函數以接受一個ValidationType枚舉數組,以在一次調用中執行多次驗證。每個控件都將爲您提供其在我們在基類中創建的屬性中的每個驗證類型的錯誤消息。

希望這會有所幫助。

謝謝 Ven

+0

請記住以可重複使用的方式創建您的功能,即不是針對某種類型的控件。這將幫助您防止重寫所有類型的控件的邏輯,並且您可以在其他項目中使用它:) – 2012-03-01 07:13:30