MVC教程/演练是否适合熟悉MVVM的人?

Rac*_*hel 2 wpf asp.net-mvc design-patterns mvvm

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

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

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

Sla*_*uma 5

当您来自MVVM模式与MVC模式(特别是ASP.NET MVC)开始我会建议认为"MVC"模式的更好的"VMVC",因为"M"在MVC是不是型号由意味着" M MV在MVVM中.它实际上对应于ViewModel.我不知道这是否代表了MVC的一般定义,但是当你使用ASP.NET MVC时,它是真实的,也是最常用和最好的做法(尽管你在SO上看到的所有示例或问题都是域实体在视图中使用(有时这正是问题中描述的问题的原因)).

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

域"Model"实际上不是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
Run Code Online (Sandbox Code Playgroud)

我不确定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
}
Run Code Online (Sandbox Code Playgroud)

MVVM中哪个部分有这个责任?我不确定.我曾经见过视图模型拥有一定的参考信息库,翻出模型(域模型)来填充自己的属性和写回通过ICommand的处理程序库的设计.这意味着MVVM中的ViewModels也有责任成为"控制器",而MVC中的ViewModel要简单得多:它们或多或少只是具有元数据的属性包,用于为视图提供和格式化数据.

最后一点:我个人认为使用WPF的MVVM模式比MVC模式更难掌握.ASP.NET MVC是从地面设计的,以支持MVC模式友好的开发,并且不需要(甚至不可能)离开这种方式.WPF不是这种情况.原始设计是在构建时考虑了视图和代码隐藏文件,而不是MVVM模式.我经常发现它是非常困难的绑定视图元素或属性的视图模型和代码behing文件处理,这是容易得多,因而违反MVVM原则位的情况.

我认为当你有MVVM模式经验时,进入MVC会有任何问题.