我的印象是viewmodel应该代表填写表单的一个实例,但我认为我可能错了,因为我看到其他人在他们的viewmodel中放了像列表这样的东西.
将它放在某个静态类并直接从View中调用会不会更好?
像CommonData.ListCountries();然后使用Lambda直接在视图中转换为SelectList项目列表?
解决方法
Scott Allen讨论了他在博客文章中处理ASP.NET MVC drop down lists的偏好. Scott使用扩展方法将复数类型的可枚举转换为IEnumerable< SelectListItem>在他的模型上.然后他描述了在回发后,ASP.NET MVC将不会返回IEnumerable< SelectListItem>他发送到视图,但只发送用户选择的值.然后他建议使用两个模型可以简化事情.
这是我称之为viewmodels和FormModels的合理描述. viewmodel将显示数据携带到视图,FormModel用于将收集的数据传送回控制器动作.进一步解释:
> viewmodels包含有助于呈现视图的数据.通过以这种方式组织我的viewmodel,我可以放置所有必要的信息,以将特定视图呈现到关联的模型中.这使我不必将ViewData用于任何不是真正临时的事情.
> FormModels用于收集用户输入. FormModels(几乎)从不包含对其他复杂类型的引用,它由基元,DateTime和字符串组成.
在任何一种情况下,我都有一个硬规则到never reuse a model for a different view.让你的模型与用于渲染它们的视图紧密对齐,使你的视图更容易编写.您不必担心静态方法之类的问题,因为您的模型应该以易于呈现的形式将数据传递到其关联的视图.像AutoMapper这样的工具可以帮助将域对象“展平”为模型以用于显示目的.
额外阅读结账:ASP.NET MVC terminology is tripping me up – why ‘ViewModel’?