Asp.net mvc 在ViewModel中放置什么

Asp.net mvc 在ViewModel中放置什么,asp.net-mvc,separation-of-concerns,Asp.net Mvc,Separation Of Concerns,你认为呢 最近一篇关于使用特殊型号活页夹以便于测试的文章让我想到了以下几点: 在构建视图模型时,您在控制器逻辑中放了什么,在视图中应该放什么?他所做的是: var viewModel = new DinnerFormViewModel { Dinner = dinner, Countries = new SelectList(PhoneValidator.Countries, dinner.Country) }; return View(viewModel);

你认为呢

最近一篇关于使用特殊型号活页夹以便于测试的文章让我想到了以下几点: 在构建视图模型时,您在控制器逻辑中放了什么,在视图中应该放什么?他所做的是:

var viewModel = new DinnerFormViewModel {  
    Dinner = dinner,  
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country)  
};  
return View(viewModel);
现在,我用同样的方式向我的视图传递数据,但我不确定他是如何处理国家财产的。你可以争论双方: 将国家/地区列表包装到SelectList中,为视图准备数据,就像创建viewmodel数据以传递数据一样。 另一方面,它让人感觉您在专门操作要在下拉列表中使用的数据,从而限制了视图处理来自控制器的数据的方式。 我觉得在视图和控制器之间的关注点分离上,这是一个有点灰色的区域,我真的无法决定该走哪条路。这方面有什么最佳实践吗

PS:为了保持简单,让我们假设默认的ASP.NETMVC上下文,因此基本上就是您的开箱即用项目。默认视图引擎和所有的jazz。

在MVC(至少是这种风格的MVC)中,控制器的职责之一是为视图准备数据。因此,我认为为视图消费准备一个特定的模型是完全可以接受的,这意味着它将在下拉列表中使用。在这种情况下,控制器只是使视图更容易,事实上防止了笨拙的代码流入视图。它还可以避免在ViewData中出现像VieData[“国家”]这样的神奇字符串


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

一些人建议,每个视图都有一个包罗万象的视图模型是理想的(称为)是的,我想你是对的。如果视图中需要国家列表的另一个表示形式,您基本上会为此创建另一个视图DTO,对吗?可能。尽管SelectList可能由不同的UI结构表示,比如复选框列表或其他东西。也许一个不同的html助手方法仍然可以使用SelectList并输出其他内容。+1以这种方式使用视图模型会从视图中删除更多的逻辑,这总是可取的。