【发布时间】:2015-03-30 22:48:13
【问题描述】:
首先,如果这个问题已经在其他地方提出并回答,我很抱歉?我在这里阅读了很多关于 MVC 的问题和答案,但(还)不太像。
我的问题是,MVC 中的模型应该知道多少?在我遇到的几乎每个教程或 MVC 示例中,页面的标题和描述都设置在 ViewBag 中,然后布局从中读取,并将其设置在页面上。
对我来说,这似乎有点不对。我认为该控制器和视图的模型应该具有 Title 属性。为此,我将有一个带有标题、描述和元集合的 BasePageModel。控制器会设置每一个,然后 _layout 会有一个@model BasePageModel 然后在页面上设置它们。
这样做是“错误的”吗(即使它确实有效),因为模型现在有点了解视图/布局?或者这更像是一个 ViewModel 而不是一个模型?
谢谢
【问题讨论】:
-
数据模型不应该具有特定于视图的属性,而是应该使用视图模型(每个视图模型都可以从(例如)具有 Title 属性的 ViewModelBase 继承以避免使用 @ 987654321@)
-
另一种方法是为
ViewData(BaseViewData<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