【问题标题】:Does using ViewModels and references to System.Web.Mvc violate the MVC pattern?使用 ViewModel 和对 System.Web.Mvc 的引用是否违反了 MVC 模式?
【发布时间】:2011-03-22 17:41:38
【问题描述】:

我在 SO、博客和书籍中都看到过,作者告诉您在模型项目中添加特定于视图的 ViewModel 作为底层模型对象的包装器。这个想法是在你对视图进行模型绑定时让它变得非常简单和有针对性。这是一个很好的例子:Rendering and Binding Drop Down Lists using ASP.NET MVC 2 EditorFor

但是,让我有点恼火的是,我的模型中现在有对 System.Web.Mvc 的引用,否则这些引用本可以用于多个出口(可能是 WCF API、Silverlight 等),但现在我有了具体的引用到构建我的模型项目所需的 MVC dll。

我的问题是:当我们开始将IEnumerable<SelectListItem> 添加到我们的模型类时,这是否违反了 MVC 模式?是否有一个可行的替代层来移动它以及如何移动它,即控制器?

任何想法或cmets表示赞赏。

【问题讨论】:

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


【解决方案1】:

我个人只在我的模型中从一个更可重用的 IEnumerable 列表中动态地在视图中创建选择列表,这意味着我的模型没有任何与 SelectLists、SelectListItems 或任何 MVC 特定相关的内容。

如承诺的示例 - 在视图中创建 SelectList,使用所有普通视图引擎位...

<%= Html.ListBox("SelectedStuff", 
        new SelectList(Model.SomeOptions, "id", "name", Model.SelectedStuff)) %>

【讨论】:

  • 动态创建选择列表是否会阻止您使用类型化视图及其对应的 HtmlHelper 方法?
  • 不-您只需在视图中创建选择列表...我将在我的答案中添加一个示例。
  • @Necros - 选择列表的要求只是特定视图的关注点。控制器不应该关心这些数据将如何显示。如果视图决定显示数据的超链接列表、下拉列表或其他内容,则您不必对控制器进行更改。您将 IEnumerable 放入控制器的解决方案很脆弱。
【解决方案2】:

不,ViewModel 旨在供 View 使用,并且应该位于您的 Web 项目中。但是,您的实际模型不应引用 MVC 或您的 Web 项目。将您的 ViewModel 视为从您的模型到您的视图的桥梁。

【讨论】:

    【解决方案3】:

    这是否违反了 MVC 模式? 开始添加 IEnumerable 到我们的 模型类?

    如果您尝试使用领域驱动设计或业务层和 MVC/表示层之间的关注点分离,则并非如此,但这是一种违规。

    • 模型是你的实体,你的 域,您的业务层对象。

    • ViewModel 是您的屏幕,表单 发帖,显示数据桶。

    模型映射到可以包含 MVC 依赖项的 ViewModel。想想如果这样,ViewModels 直接用于 MVC。模型可以用于服务、winform、WPF 或业务系统系统的任何程序化表示。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2016-12-29
      • 2023-04-06
      • 2015-05-19
      相关资源
      最近更新 更多