你在视图中放了什么?
最近博客从斯科特Hanselman的有关使用一个特殊的模型绑定,方便测试使我想到了以下几点:你放什么在你的控制器逻辑构建视图模型,哪些应放在有何看法?他做的是这样的:
var viewModel = new DinnerFormViewModel { Dinner = dinner, Countries = new SelectList(PhoneValidator.Countries, dinner.Country) }; return View(viewModel);
现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理Countries属性.您可以争辩双方:在SelectList中包装Country列表会为视图准备数据,就像创建一个viewmodel DTO来传递数据一样.另一方面,它有点像你专门操作下拉列表中使用的数据,限制了视图处理来自控制器的数据的方式.我觉得这对于视图和控制器之间的关注点分离是一个灰色区域,我无法真正决定走哪条路.对此有什么最佳做法吗?
PS:为了简单起见,让我们假设默认的ASP.NET MVC上下文,所以基本上你的开箱即用项目.默认视图引擎和所有爵士乐.
在MVC(至少它的这种风格)中,控制器的职责之一是为视图准备数据.所以我认为为视图消费准备一个特定的模型是完全可以接受的,这意味着它将用于下拉列表中.在这种情况下,控制器只是使视图更容易,并且实际上防止了笨拙的代码不得不进入视图.它还使一个人不像ViewData ["Countries"]那样拥有ViewData中的魔术字符串.
总而言之,虽然看起来在责任方面可能存在一些灰色区域,但最终这是控制器的工作:与视图交互并将域模型转换为更容易被消费者使用的其他模型视图.
有人建议每个视图都有一个包罗万象的视图模型是理想的(被称为Thunderdome Principle).