2011-05-16 79 views
0

作爲學習.NET的練習,我將一些簡單的表單轉換爲MVC,並且遇到了一個問題。有問題的表單是具有選項部分的多部分表單。例如,Section 0是靜態的,包含用戶名,真實姓名,電子郵件地址等信息。之後是一個帶有幾個選項的單選按鈕。如果您單擊第一個收音機,則會顯示第1部分。如果您選擇第二個收音機,則會顯示第2部分,依此類推。我應該通過partials渲染表單的可選部分嗎?

在WebForms中,這並不是什麼大事,因爲我剛剛在回發中進行了驗證,並且說如果Radio1.Selected驗證了這一點,Radio2.Selected驗證了這一點,等等。所以現在我得到了一個強類型的視圖,成員,這顯然不會起作用 - 我不能要求那些並不總是需要的成員。

隨着中說,這是正確的解決問題的方法:

  • 創建第2.2節在我的強類型的視圖模型類屬成員。
  • 在我的視圖模型類中爲每個部分的強類型類創建引用。
  • 創建部分視圖,然後在主視圖中渲染它們。
  • 根據所選的單選按鈕,渲染適當的局部視圖。
  • 像往常一樣驗證模型...希望會級聯到部分模型。

這是否有意義,或者是方法錯誤?

回答

0

這是一種典型的情況,您需要進行條件驗證,即如果設置了某個值,則驗證是否需要其他值。通過靜態數據註釋來實現這一點,這些註釋是編譯時烘焙的簡單屬性,由於它們的聲明性質,可能很快變成噩夢。那麼,你總是可以推出你自己的自定義驗證屬性,但是屬性的問題是你必須指定屬性名稱作爲字符串,因爲它們需要在編譯時知道。

這就是我使用FluentValidation.NET的原因之一。不僅驗證規則與視圖模型是分開的,而且它處理這樣的場景會非常容易。您可以有一個包含子部分所有屬性的子視圖模型,然後根據驗證器內部主視圖模型上給定屬性的值有條件地包含它。

+0

「但屬性的問題是,您必須指定屬性名稱作爲字符串,因爲它們需要在編譯時知道。」這是不正確的。你總是可以投出並從那裏出發。 – jfar 2011-05-16 18:05:33