【问题标题】:MVC tutorial/walkthrough that is meant for people familiar MVVM?适用于熟悉 MVVM 的人的 MVC 教程/演练?
【发布时间】:2011-10-28 16:05:11
【问题描述】:

我习惯于使用 MVVM 设计模式在 WPF 中工作,但最近有人要求我在 ASP.Net 中做一些事情。我想尝试使用MVC,因为我在学习MVVM时看到它引用了很多,但是我对此一无所知。

我可以找到许多旨在向熟悉 MVC 的人解释 MVVM 的网站,但是我找不到一个向习惯于 MVVM 的人解释 MVC 的好网站。有些网站自己解释了 MVC,但我很难理解它们,因为我的大脑一直在尝试应用 MVVM 逻辑。

那么,有没有什么好的网站可以用熟悉 MVVM 的人可以理解的术语来解释 MVC?或者有人可以在这里给我解释一下吗?

【问题讨论】:

  • 为什么不跳过解释,直接在你的 Web 开发中使用 MVVM:knockoutjs.com
  • @SteveGreatrex 我考虑过这一点,但是我在某处读到,由于绑定系统的工作方式,MVVM 主要用于 WPF/Silverlight 开发,并且未针对与 ASP.Net 的使用进行优化
  • 根据我们的on-topic 指导,“有些问题仍然是题外话,即使它们属于上面列出的类别之一:...向我们提问的问题推荐或查找书籍、工具、软件库、教程或其他场外资源是题外话..."

标签: wpf asp.net-mvc design-patterns mvvm


【解决方案1】:

当您来自 MVVM 模式并从 MVC 模式(尤其是 ASP.NET MVC)开始时,我建议将“MVC”模式更好地视为“VMVC”,因为 MVC 中的“M”不是 Model 表示 MVVM 中的“M”。它实际上对应于 ViewModel。我不知道这是否代表了 MVC 的一般定义,但是当您使用 ASP.NET MVC 时,它是真实的,并且是最常用和最佳实践(尽管您不时在 SO 上看到域实体所在的示例或问题在视图中使用(这有时正是问题中描述的问题的原因)。

当我从一个 Visual Studio 模板创建 ASP.NET MVC 项目时,我通常做的第一件事是将创建的文件夹“Model”重命名为“ViewModel”。如果您查看模板代码对这些“模型”的作用,您会发现它们直接用于视图,它们具有用于输入验证、显示格式以及视图上的字段命名的数据注释。这些注释部分由 HTML 助手直接用于生成 HTML,并不代表域或业务逻辑。换句话说:它们是 Razor/HTML 视图的 ViewModel,就像您在 MVVM 中为 WPF/Silverlight/Phone7 中的 XAML 视图使用 ViewModel 一样。

域“模型”实际上不是 MVC 模式的一部分,因为它是 MVVM 模式的一部分。因此,当您将 MVVM 与 MVC 进行比较时,缩写词有些误导。作为一个非常简化的“翻译表”,可以说:

MVVM                         MVC
----                         ---
M  -> Domain Model           not part of the pattern
V  -> View (XAML)            V -> View (HTML, Razor)
VM -> ViewModel              M -> ViewModel
not part of the pattern      C -> Controller

我不确定 MVVM 中控制器的相应内容。在 MVC 中,控制器通常是将域对象转换为 ViewModel,然后转换为视图(反之亦然)的模块 - 示意图:

ControllerActionForGetRequest ( params )
{
     objects = GetDomainObject(params)    - entities, queryables or DTOs
     viewModel = CreateViewModelFromDomainObjects(objects)
     view = CreateViewFromViewModel(viewModel)
}

ControllerActionForPostRequest ( viewModel )
    // ModelBinder makes "viewModel" from HTML input fields, etc
{
     if (IsValid(viewModel))
     {
         data = CreateDomainObjectsOrDtosFromViewModel(viewModel)
         WriteData(data)  - back to data store
         RedirectToActionForGetRequest
     }
     else
         GoBackToView
}

MVVM 的哪个部分有这个责任?我不知道。我见过这样的设计,其中 ViewModel 持有对存储库的一些引用,拉出模型(域模型)以填充其自己的属性并通过 ICommand 处理程序写回存储库。这意味着 MVVM 中的 ViewModel 也有责任成为“控制器”,而 MVC 中的 ViewModel 则要简单得多:它们或多或少只是带有元数据的属性包,用于为视图提供和格式化数据。

最后一点:我个人发现带有 WPF 的 MVVM 模式比 MVC 模式更难掌握。 ASP.NET MVC 从一开始就设计为支持 MVC 模式友好的开发,没有必要(甚至不可能)离开这种方式。这不是 WPF 的情况。最初的设计是在考虑视图和代码隐藏文件的情况下构建的,而不是使用 MVVM 模式。我经常发现很难将视图元素或属性绑定到 ViewModel 并且在代码隐藏文件中处理它要容易得多,因此有点违反 MVVM 原则。

我认为,当您有 MVVM 模式的经验时,进入 MVC 不会有任何问题。

【讨论】:

  • 很好的解释,特别指出了 MVC 模型和 MVVM 模型之间的区别。我花了一点时间才弄清楚这一点,因为我期望两个 M 是一样的。我已经开始学习 MVC,我现在意识到 MVC 的 M+C 等于 MVVM 的 VM,而 MVC 的 M 包含 MVVM 的 MVM 的混合。
  • @Rachel:啊,很高兴你确认VM = M+C。我不确定。对于第二部分:我可能会将 MVVM(域模型)的 M 完全排除在 MVC 中的 ViewModel 之外。例如,这篇文章中的StaffViewModelstackoverflow.com/q/8010566/270591,它看起来不是很像 MVVM 吗?)是一种反模式,因为 1)网页上没有 PropertyChanged 事件有助于更新模型和 2)出于安全原因:将比用户在页面上编辑的更多属性暴露给模型绑定器是一种潜在风险(操纵 HTTP 发布请求)。
  • 到目前为止,我理解它的方式是 MVC 的 M 包含您通常在 MVVM 的 VM 中找到的属性,但删除了所有功能(因此它的行为类似于 MVVM 的 M )。 C 是您可以在 MVVM 的 VM 中找到的功能,例如数据访问、高级业务规则验证等。
【解决方案2】:

Rachel,我没有遇到任何面向 MVVM 人群的 ASP.NET MVC 网站,但从第一手经验来看,我认为 ASP.NET MVC Music Store 绝对很棒。

我最初是一名 WebForms 开发人员,我绝对可以证明,在学习另一种技术的同时,你的脑海中有某种技术,迫使你的逻辑以某种方式转变。从 Webforms -> MVC 开始,这尤其困难。我的最佳建议是将音乐商店教程的各个方面作为一个单独的实体进行分析。

祝你好运,希望对你有所帮助。

【讨论】:

  • 我实际上早先下载了该代码,并在尝试构建它时出错。我不是一个强大的网络开发人员,所以我没有花很多时间来修复它,但我可以再看看它。
  • @Rachel 实际上,随着教程的进行,我发现编写代码更容易。我认为它有助于您在编写代码时学习更多,而不是仅仅阅读一些已经编写的源代码。让我知道你遇到的错误,也许我可以帮忙。
  • 为伟大的 MVC 教程 +1。我同意你确实学到了更多编写代码而不是仅仅阅读它,但我也喜欢先查看完成的产品,看看我正在努力的方向。您链接中的代码运行没有任何错误,所以我之前一定下载了旧版本的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多