2010-02-15 31 views
3

我有一個模型,它看起來是這樣的:在ASP.NET中使用的SelectList掙扎MVC 2

public class SampleModel 
{ 
    public static SampleModel Create() 
    { 
     return new SampleModel 
     { 
      Boolean = true, 
      // set several more properties... 
      Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green") 
     }; 
    } 

    public bool Boolean { get; set; } 
    // define several more properties... 
    public SelectList Colors { get; set; } 
} 

我讓我的詳細信息查看和Html.EditorForModel() ASP.NET MVC的腳手架自動使用Html.DisplayForModel()屬性我的編輯視圖。

結果:

  • 編輯視圖的偉大工程。 Colors顯示爲包含三個項目(紅色,綠色和藍色)的菜單,默認情況下選擇綠色。

  • 但是,對於Details視圖,我會得到「False True False」,這顯然是菜單中每個項目的IsSelected值的列表。這絕對不是我想要的。我希望它只顯示「綠色」。

  • 另一個問題是,如果我嘗試在我的控制器中執行UpdateModel(sampleModel),則會出現錯誤「沒有爲此對象定義無參數構造函數」。這大概是因爲ColorsSelectList,並且SelectList沒有無參數的構造函數,所以它無法完成綁定。

所以,我想我明白有什麼問題,但我真的可以使用的這種情況下,這似乎拿出了很多,當你有機型外鍵對象一個很好的解決方案。

一些問題:

  1. 我怎麼Colors露面作爲編輯視圖菜單,但只是一個簡單的字符串值(例如,「綠色」)的詳細信息視圖?
  2. 如何在更新包含SelectList的模型時防止「無參數構造函數」錯誤?
  3. 如果我的Model/ViewModel實際上包含外鍵ColorId而不是Colors,那麼獲取Details視圖顯示當前顏色名稱和Edit視圖以顯示包含所有在我的數據庫的Color表中列出的顏色名稱。如果有幫助,我使用LinqToSql(SqlMetal)來生成我的模型類。

回答

3

您的問題都來自於您將SelectList作爲模型屬性公開的事實。根據具體情況,我可能會做這樣的事情:

  1. 創建3個單獨的模型類:包括你的LinqToSql對象的一個​​「域」模式(或他們周圍的包裝)和兩個視圖模型,一個用於詳細信息視圖和一個用於編輯視圖。

  2. 詳細信息視圖模型應該包含當前選擇的顏色名稱。詳細信息操作將設置此屬性,可以使用域對象中的FK關係或手動查找所選顏色的詳細信息。

  3. 編輯視圖模型應該包含所選顏色ID的屬性。它還應包含可用顏色選項的選擇列表,並將所選值設置爲當前選定的標識。

  4. 處理表單發佈的編輯操作應接受編輯視圖模型的實例,並應將這些更改映射到域模型上。由於所選顏色是一個簡單的屬性,而不是一個選擇列表,所以很容易驗證並映射回業務對象。

如果您的情況非常簡單,那麼您可以使用View和Edit的單一視圖模型,甚至直接將該域對象傳遞給Details視圖。無論如何,只要您從模型中刪除SelectList,並將選定的顏色作爲簡單ID公開,那麼您應該可以。

+1

確實,單獨的編輯和視圖模型不會導致具有許多相同屬性的類對,但它也使修改一個視圖非常容易,而不會影響其他視圖。我更謹慎地保持我的邏輯DRY,而不是我的DTO。你也可以有一個視圖模型來自另一個視圖模型,但除非你的視圖非常簡單,否則這可能比它的價值更麻煩。 –