放在ViewModel中的内容

时间:2009-02-08 23:23:14

标签: asp.net-mvc separation-of-concerns

你在视图中放了什么?

最近blog来自Scott Hanselman关于使用特殊模型绑定器进行更简单的测试让我想到以下内容: 您在构建视图模型的控制器逻辑中放置了什么,以及应该在视图中放置什么?他做的是这个:

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

现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理Countries属性。你可以争辩双方: 在SelectList中包装Countries列表会为视图准备数据,就像创建一个viewmodel DTO来传递数据一样。 另一方面,它有点像你专门操作下拉列表中使用的数据,限制了视图处理来自控制器的数据的方式。 我觉得这对于视图和控制器之间的关注点分离是一个灰色区域,我无法真正决定走哪条路。对此有什么最佳做法吗?

PS:为了简单起见,让我们假设默认的ASP.NET MVC上下文,所以基本上是你开箱即用的项目。默认视图引擎和所有爵士乐。

2 个答案:

答案 0 :(得分:14)

在MVC中(至少是它的这种风格),控制器的职责之一是为视图准备数据。所以我认为为视图消费准备一个特定的模型是完全可以接受的,这意味着它将用于下拉列表中。在这种情况下,控制器只是使视图更容易,并且实际上防止了笨拙的代码不得不进入视图。它还使一个人不会像ViewData [“Countries”]那样拥有ViewData中的魔术字符串。

总而言之,虽然看起来在责任方面可能存在一些灰色区域,但最终这是控制器的工作:与视图交互并将域模型转换为更容易的其他模型消费观点。

答案 1 :(得分:7)

有人建议每个视图都有一个包罗万象的视图模型是理想的(被称为Thunderdome Principle)。