2009-02-08 111 views
14

你在視圖中放什麼?怎麼把你的ViewModel

最近blogScott Hanselman有關使用一個特殊的模型綁定,方便測試使我思考如下: 你放什麼在你的控制器邏輯構建視圖模型,哪些應放在有何看法?他所做的是這樣的:

var viewModel = new DinnerFormViewModel { 
    Dinner = dinner, 
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country) 
}; 
return View(viewModel); 

現在,我使用將數據傳遞給我的看法相同的方式,但我不確定他是如何與這些國家的房地產交易。您可以爭辯雙方: 在SelectList中包裝國家/地區列表爲視圖準備數據,就像您創建視圖模型DTO來傳遞數據一樣。另一方面,它不知何故感覺就像是在專門處理要在下拉列表中使用的數據,限制了視圖處理來自控制器的數據的方式。 我覺得這是關於視圖和控制器之間關注點分離的一個灰色區域,我不能真正決定走哪條路。有沒有這方面的最佳做法? PS:爲了簡單起見,我們假設默認的ASP.NET MVC上下文,所以基本上你是開箱即用的項目。默認視圖引擎和所有爵士樂。

回答

13

在MVC中(至少這是它的味道),控制器的責任之一是爲視圖準備數據。所以我認爲爲視圖消耗準備一個特定的模型是完全可以接受的,這意味着它將用於下拉菜單。在這種情況下,控制器只是簡化了視圖,事實上防止笨拙的代碼不得不以其他方式流入視圖。它還使ViewData中的這些魔術字符串像VieData [「Countries」]一樣。因此,總而言之,儘管在責任方面似乎存在一些灰色區域,但最終這就是控制器的工作:與視圖交互並將領域模型轉換爲其他更容易的模型由視圖消費。

+0

是的,我認爲你是對的。如果在視圖中需要另一個國家列表的代表,你基本上會爲此創建另一個視圖DTO,對吧? – 2009-02-08 23:47:28

7

一些人認爲每個視圖有一個包羅萬象的視圖模型是理想的(被稱爲Thunderdome Principle)。