2010-06-19 74 views
4

最初的情況是我將我的領域模型映射到演示模型。ASP.NET MVC ViewData和視圖模型最佳實踐

我必須顯示帶有文本框和下拉列表的更新/創建公式。

如果viewmodel包含下拉列表的列表,還是應該使用ViewData傳遞下拉列表的數據?

什麼時候應該使用ViewData,何時不應該使用它?

像下拉列表這樣的輸入字段有單獨的視圖模型嗎?

回答

4

我傾向於嘗試儘可能少地使用ViewData,因爲您總是需要施加值,您需要爲空值或不存在的鍵進行錯誤檢查,並且在我看來,它會混亂視圖。

我傾向於嘗試並儘可能使用viewmodels,因爲我發現強烈地將模型的視圖輸入爲更簡潔的方法。

我會將盡可能多的數據放入視圖模型中,但只有有意義。對於不應該屬於視圖模型的數據,我會以ViewData形式傳入,但會盡量減少數量。

只要你問的是輸入字段,如果它們都是相關的,我會爲它做一個ViewModel,而不是在ViewData中傳遞5或10個數據,因爲邏輯上將它們分組在一個地方是有意義的。這確實是一個偏好問題,但我發現這種方法對我來說是最好的。

2

真是個人選擇。 ViewData的缺點是輸入較弱,需要投射。

1

您應該將該列表作爲模型的一部分。或者,如果列表非常普遍(例如,狀態列表或「是/否」列表),則可以在靜態類中創建一個靜態列表,該列表可以直接在ViewPage中引用。我不明白你爲什麼想通過ViewData傳遞它,因爲你必須在ViewPage中投射你的列表。

+0

http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx – Rookian 2010-06-22 15:34:16

2

您可能想看看NerdDinner,特別是DinnerFormViewModel和可供選擇的國家/地區列表。基本上,他們有一個Dinner模式(用於索引視圖,他們需要一個集合)以及一個DinnerFormViewModel,其中包含一個Dinner實例和一個SelectList。創建視圖(恰當地命名爲DinnerForm)當然是強類型的,並且需要DinnerFormViewModel。

2

我發現了一些很有趣的在這裏... http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx

正是我需要的。

+1

我走得更遠一步。我沒有在控制器中設置ViewData字段,而是使用ActionFilter在我的模型上查找空選項列表,並根據泛型自動填充它們。 (如果你有一些視圖特定的邏輯來顯示什麼選項,這是行不通的。)例如'選項'將被填充所有用戶類型的列表。 – Ryan 2010-06-22 16:41:56

+0

此答案中的鏈接已損壞。 – PixelPlex 2017-05-01 12:14:24