2010-02-08 72 views
5

我只是想知道人們在哪裏創建他們的SelectList - 在動作或視圖中。ASP.net MVC:在視圖或動作中創建SelectList?

我見過兩個例子,並且是很有道理的我是這樣做的動作,並具有視圖模型有型的SelectList的屬性之一。另一方面,我已經看到人們有視圖模型具有SelectList屬性並且SelectList在視圖模型(在構造函數中或通過延遲加載)中被填充的例子。我喜歡這個主意,因爲它意味着在我的行動更少的代碼...

總之我只是想知道是什麼人在做大氣壓。

乾杯安東尼

回答

5

創建控制器您的SelectList(通過查找你從你的模型庫項目的列表),並把它傳遞給視圖無論是作爲ViewData的對象,或作爲您的強類型的部分視圖模型。

+0

爲什麼?如果您提供更多關於您認爲這種方法更可取的原因的詳細信息,我會很高興得到讚賞。測試更容易嗎?促進代碼重用?更好地分離擔憂? – 2010-02-18 13:58:27

+0

@Seth:強類型ViewModel對象的目的是打包視圖所需的所有數據,以便正確呈現它。在這種情況下,因爲下拉菜單需要項目列表,所以將其包含在ViewModel對象中是適當的。後面的程序員會在ViewModel中看到SelectList,並得出結論,它正被用來填充視圖中的下拉菜單。而且他不必看別的地方。 – 2010-02-18 15:26:48

+0

@羅伯特:我完全同意你的看法。我的觀點是,你的答案被選爲「正確」的答案,並且我認爲一些其他信息可能對將來遇到此問題的人有所幫助。我寧願新的MVC程序員知道_why_這是可取的,而不是盲目地遵循這樣的答案:) – 2010-02-18 16:04:25

1

我通常在動作或服務層中創建我的SelectList,並通過ViewData將其傳遞給我的視圖。我也使它成爲視圖模型和強類型視圖的一部分。儘管這兩種方式都在動作或服務層中創建它。

+0

通過ViewData傳遞SelectLists是可以的,但是如果你的頁面被強類型化爲ViewModel對象,那麼它就更簡潔了,只是將你的SelectLists作爲ViewModel。 – 2010-02-08 15:22:39

+0

同意了,這就是我所做的,如果需要發送更多的數據到視圖,而不僅僅是選擇列表。如果我只需要一個選擇列表,那麼我傾向於使用ViewDat一個。 – 2010-02-08 20:20:49

1

我有暴露在視圖模型中的財產的SelectList,並使用所需的存儲庫填充它的行動。我認爲直接與存儲庫交互的代碼應該是負責填充的代碼,無論是控制器操作還是服務層或其他任何內容。

我不認爲直接從視圖模型填充列表是一個好主意,因爲它需要視圖模型具有存儲庫依賴性並進行數據庫交互,並且視圖模型不應該對此類負責東西的。

你也可以創建一個單獨的特殊對象,稱爲初始化器或類似的東西,做所有填充和初始化,如果您有多個的SelectList領域,要保持你的動作代碼更加清晰。

+0

「我不認爲直接從視圖模型填充列表是一個好主意,因爲它需要視圖模型具有存儲庫依賴性」 - 不一定。視圖模型被填充到控制器中(包括SelectList所需的項目列表),因此視圖模型本身不需要存儲庫依賴關係。 – 2010-02-08 15:20:05

+0

這正是我的觀點。應該從控制器調用存儲庫填充代碼,而不是從視圖模型代碼(構造函數或其他方法)中調用。 – Victor 2010-02-08 21:25:43

2

It's一個具體表現 - 方面,所以我喜歡做它在視圖,使用HTML幫手。所以我將一個集合傳遞給View,並使用html helper方法將這些項目映射到SelectListItems。該方法可能看起來非常像這樣:

public static IList<SelectListItem> MapToSelectItems<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected) 
{ 
    var result = new List<SelectListItem>(); 

    foreach (var item in itemsToMap) 
    { 
     result.Add(new SelectListItem 
     { 
      Value = valueProperty(item), 
      Text = textProperty(item), 
      Selected = isSelected(item) 
     }); 
    } 
    return result; 
} 

問候。

+0

你仍然需要在你的ViewModel中創建一個項目列表,爲什麼不把它變成一個SelectList呢? – 2010-02-08 15:21:16

+0

你是對的,我正在考慮將模型作爲一個實體或一個dto從一個實體(而不是視圖特定的模型或ViewModel)翻譯過來,無論如何,你可以使用上面的方法來進行翻譯。 – uvita 2010-02-08 15:41:18

+0

我認爲特定於視圖的模型應該直接暴露一個SelectList,因爲它減少了在視圖中編寫的代碼量,即使只是一點點。但在某些情況下,我會將DTO或業務對象傳遞給視圖,並且在這些情況下,我將調用像上面顯示的幫助器[我的視圖中的.ToSelectList()]。我認爲這兩種方法在不同情況下都適用。 – 2010-02-18 14:05:05