14

你在你的视图中放了什么?

Scott Hanselman最近的一篇关于使用特殊模型绑定器来简化测试的博客让我想到了以下问题:在构建视图模型的控制器逻辑中放置了什么,应该在视图中放置什么?他所做的是:

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

现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理 Country 属性。您可能会争论双方:将国家列表包装在 SelectList 中会为视图准备数据,就像您创建视图模型 DTO 来传递数据一样。另一方面,感觉就像您在专门操作要在下拉列表中使用的数据,从而限制了视图处理来自控制器的数据的方式。我觉得这在视图和控制器之间的关注点分离上有点灰色地带,我真的无法决定走哪条路。有没有这方面的最佳实践?

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

4

2 回答 2

14

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

总而言之,虽然在职责方面似乎存在一些灰色地带,但最终这就是控制器的工作:与视图交互并将域模型转换为其他更容易被控制器使用的模型。看法。

于 2009-02-08T23:35:21.180 回答
7

一些人建议每个视图拥有一个包罗万象的视图模型是理想的(称为Thunderdome 原则)。

于 2009-02-08T23:57:04.653 回答