2009-02-08 108 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)。