【问题标题】:How much responsibility should the Model have in MVC?Model 在 MVC 中应该承担多少责任?
【发布时间】:2015-03-30 22:48:13
【问题描述】:

首先,如果这个问题已经在其他地方提出并回答,我很抱歉?我在这里阅读了很多关于 MVC 的问题和答案,但(还)不太像。

我的问题是,MVC 中的模型应该知道多少?在我遇到的几乎每个教程或 MVC 示例中,页面的标题和描述都设置在 ViewBag 中,然后布局从中读取,并将其设置在页面上。

对我来说,这似乎有点不对。我认为该控制器和视图的模型应该具有 Title 属性。为此,我将有一个带有标题、描述和元集合的 BasePageModel。控制器会设置每一个,然后 _layout 会有一个@model BasePageModel 然后在页面上设置它们。

这样做是“错误的”吗(即使它确实有效),因为模型现在有点了解视图/布局?或者这更像是一个 ViewModel 而不是一个模型?

谢谢

【问题讨论】:

  • 数据模型不应该具有特定于视图的属性,而是应该使用视图模型(每个视图模型都可以从(例如)具有 Title 属性的 ViewModelBase 继承以避免使用 @ 987654321@)
  • 另一种方法是为ViewDataBaseViewData<TViewModel> : ViewDataDictionary<TViewModel>,这种方法适用于我(并且完全避免使用ViewBag)创建一个标准超类,但稍后会涉及一些管道。每当我定义一个一个页面的视图模型我也创建了一个新的BaseViewData派生类,所以两者是密切相关的。ViewModel 只存储客户端浏览器将返回到服务器的数据,而 ViewData 只存储存储从服务器到客户端的“单向”数据。
  • 不幸的是,对于这种格式来说,这有点太宽泛了,也有点太固执己见了。 MVC 模式是一种结构化代码的建议方法,它不是法律。许多基于 MVC 的框架都有自己的约定,这些约定略有不同,但在大多数情况下仍然忠实于核心建议....
  • @StephenMuecke 我同意数据模型(在我的情况下为 EF)不应该知道页面,除非它是用于具有 Title 和 Description 属性的 BlogPost 之类的东西。那么,对于具有这两个属性的 BlogPost(EF 数据模型),应该如何将它们传递给 View?在 MVC 项目中有一个新的 BlogPostModel 模型(数据模型在他们自己的项目中),它有一个 View 读取的 Title 属性是错误的吗?或者,这样做会使其成为“ViewModel”吗?

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


【解决方案1】:

你说得对,它属于 ViewModel。我认为您的示例稍微令人困惑的部分是您需要区分 blog 标题和 page 标题。

您通常会为所有具有标题和描述属性的页面拥有一个通用的 ViewModelBase,当您具体化 ViewModel 时将手动填充这些属性。对于博客文章,您将从 BlogPost 数据模型填充 ViewModel。

“MVC”作为一种设计模式并没有考虑到适当的关注点分层。在最纯粹的形式中,您要么在控制器中获得逻辑,要么在模型中获得混乱且有时难以测试的模型。

每个开发商店的项目结构都略有不同,以便于维护,每个人都有自己的意见(除了最容易维护的东西,没有正确的答案)但是作为示例,我们的应用程序层通常结构为

  • 数据模型(EF,只对查询可见,理论上是“存储库”)
  • 查询(特定于上下文的模型实现 - 不要“包含”您不需要的内容)
  • 服务(从外部来源收集数据并汇总)
  • ViewModels(只传递必要格式的数据。如果看起来很简单,请使用自动映射器)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多