2009-05-02 120 views
1

我不知道人們是否已經問過這個問題或者 他們沒有看到這個問題或者其他什麼。Asp.net MVC表單驗證相關

我正在爲每個創建視圖創建強類型視圖。

我在服務器端通過創建LINQ類實體的部分類來驗證表單。

通過添加功能就像

public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     if (String.IsNullOrEmpty(Name)) 
      yield return new RuleViolation("Name is Required", "Name"); 
     if (String.IsNullOrEmpty(Date.ToString())) 
      yield return new RuleViolation("Date is Required", "Date"); 
     yield break; 
    } 

我的控制器操作的結構類似於 alt text http://www.scottgu.com/blogposts/mvcpreview5/step15.png

問題

如果Name字段長度爲VARCHAR2(10),以及用戶輸入超過名稱這個限制然後產品(見圖片)對象將有名字爲字符串。

更超過其它問題同上像日期如果用戶沒有輸入日期,然後也對象將有日期像1/1/0001。

摘要:我們應該使用這種方法嗎? 或使用方法像通過使用FormColletion或Request.Form獲取所有元素...

凸輪你給我最好的建議呢?

另見Justin_etheredge's post

回答

1

有很多對這一問題的潛在解決方案。

  • 對於字符串:我用的是使用反射來獲取字符串的最大長度從在LINQ實體屬性的屬性欄,並檢查這些驗證。或者,如果列將被截斷,則可以處理插入時發生的錯誤。

  • 對於日期:您可以對日期(即必須在某個合理的日期之後)進行健全性檢查,必須由用戶輸入或對於可以自動執行的日期,使用數據庫生成的默認值並標記財產作爲自動生成和設計器中的只讀。不要將這些日期放在表單上,​​以免在發佈頁面時在實體中設置它們。這適用於「創建日期」等。對於修改日期,執行類似的操作,但具有由更新觸發器生成的值,而不是更新時的默認值。

  • 對於布爾值(默認爲false):驗證值提供程序除了對實體本身進行驗證之外,還爲該字段嘗試了一個值。或者,您可以使列可以爲空,並檢查它是否爲空。兩者都是妥協,但後者使數據模型符合驗證框架,所以我更喜歡前者。

1

這是一種做事的方式 - 但它幾乎打破了MVC模式。你執行檢查的方式是基本上允許LINQ和上下文來處理它 - 這就是爲什麼你要解決問題。理想情況下,您希望在您的控制器和實際數據之間創建一個層 - 例如服務層(例如商業智能(BI)層)。

在那個服務層是你要實現規則的地方 - 比如名字的長度,日期的有效性,什麼是和不允許。如果在那裏有什麼問題,那麼你可以冒出錯誤並讓控制器處理它們。

理想情況下,您希望在控制器和實際邏輯之間創建一個抽象級別。

我會看到,如果我能得到一個例子了不久(有什麼地方拿出的那一刻...)

+0

,如果我們不使用LINQtoSQL類,那麼什麼MS實體框架? 我不知道這個問題在MS EF ...讓我檢查這 – Vikas 2009-05-02 12:59:16