使用ViewModels和对System.Web.Mvc的引用是否违反了MVC模式?

时间:2010-07-29 13:33:54

标签: asp.net-mvc model-view-controller asp.net-mvc-2 viewmodel

我已经在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模式吗?是否有一个可行的替代层来移动它和如何,即控制器?

任何想法或评论都赞赏。

3 个答案:

答案 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间隙。