我已经在SO,博客和书籍上看到了这一点,作者告诉您在模型项目中将ViewModel特定于View作为底层模型对象的包装。我们的想法是,当您对View进行模型绑定时,使其变得非常简单和有针对性。这是一个很好的例子:Rendering and Binding Drop Down Lists using ASP.NET MVC 2 EditorFor
然而,我觉得我的模型中现在有一些对System.Web.Mvc的引用让我感到烦恼,否则它本来可以用于多个出口(可能是WCF API,Silverlight等),但现在我有特定的引用到MVC dll将需要我的模型项目来构建。
我的问题是:当我们开始向模型类添加IEnumerable<SelectListItem>
时,这会违反MVC模式吗?是否有一个可行的替代层来移动它和如何,即控制器?
任何想法或评论都赞赏。
答案 0 :(得分:6)
我个人只在视图中动态创建选择列表,从我模型中更易于使用的IEnumerable列表中创建,这意味着我的模型没有任何与SelectLists,SelectListItems或任何MVC特定相关的内容。
承诺的示例 - 使用所有普通视图引擎位在视图中创建SelectList ...
<%= Html.ListBox("SelectedStuff",
new SelectList(Model.SomeOptions, "id", "name", Model.SelectedStuff)) %>
答案 1 :(得分:3)
当我们这样做时,这会违反MVC模式 开始添加 IEnumerable给我们 模特课?
如果您尝试使用域驱动设计或业务层与MVC /表示层之间的关注点分离而不是违规,则不是真的。
模特是你的实体,你的实体 域,您的业务层对象。
ViewModels是您的屏幕,表单 发布,显示数据桶。
模型映射到ViewModels,它可以包含MVC依赖项。想想看是否这样,ViewModels直接用于MVC。模型可以用于服务,winform,WPF或业务系统系统的任何程序化表示。
答案 2 :(得分:1)
不,ViewModel应由View使用,并且应位于您的Web项目中。但是,您的实际模型应该没有引用MVC或您的Web项目。可以将ViewModel视为桥接从模型到视图的Web间隙。