当我在阅读《ASP.NET MVC 4》这本书时,我对MVVM感到困惑。于是我开始了解,但没有找到任何关于使用MVVM开发Web应用程序的书籍,所以我可能缺少一些信息。
据我所知,MVVM通过knockout.js和其他框架在客户端的Web应用程序中使用。然而,如果我要开发Windows Phone应用程序,我可以直接使用MVVM而不使用MVC。 这是否意味着,MVVM /数据绑定的概念不适用于客户端 - 服务器Web应用程序?
当我在阅读《ASP.NET MVC 4》这本书时,我对MVVM感到困惑。于是我开始了解,但没有找到任何关于使用MVVM开发Web应用程序的书籍,所以我可能缺少一些信息。
据我所知,MVVM通过knockout.js和其他框架在客户端的Web应用程序中使用。然而,如果我要开发Windows Phone应用程序,我可以直接使用MVVM而不使用MVC。 这是否意味着,MVVM /数据绑定的概念不适用于客户端 - 服务器Web应用程序?
MVVM是一种子模式。目前并没有真正的“MVVM” Web应用程序框架。它们都是MVC,如果您想要视图模型,您基本上只需要将其合并。
特别是在ASP.NET MVC中,您只需创建一个类,通常以[Model Name]ViewModel
或[Model Name]VM
的形式命名。该类仅包含您需要处理的模型属性和任何额外的属性,这些属性与实际基于数据库的模型无关,例如SelectList
等。
在您的操作中,只需将此视图模型的实例传递给视图,而不是传递您的模型:
return View(viewModelInstance);
当然,确保你的视图接受它:
@model Namespace.To.MyViewModel
唯一稍微复杂的是将视图模型与模型连接起来(即获取数据到/从视图模型/模型)。您可以通过显式映射属性手动完成此操作,或者您可以使用类似于AutoMapper的工具。
MVVM是WPF/Silverlight开发的标准设计模式,不应与ASP.Net开发的MVC混淆。
这两者听起来可能相似并且有一些共同点,但它们是两种不同的设计模式。
从我对knockout.js的了解来看,它旨在创建类似于WPF/Silverlight开发中使用的“数据绑定”,因此MVVM设计模式适用于该领域。
引用我另一个答案中关于MVVM和MVC之间差异的描述:
在MVVM中,你的代码类(ViewModels
)是你的应用程序,而Views
只是一个漂亮的用户友好界面,位于应用程序代码之上,允许用户与之交互。这意味着ViewModels
有很大的工作量,因为它们是你的应用程序,并负责从应用程序流程到业务逻辑的所有内容。Views
是您的应用程序,而Controller
处理应用程序流程。应用程序逻辑通常在ViewModels
中找到,它们被视为MVC中的一部分(MVC中的M层包含比MVVM中的M层更多的功能)。用户会得到一个屏幕(View
),他们与之交互,然后将某些东西提交给Controller
,Controller
决定谁使用数据做什么,并返回一个新的View给用户。MVC是一种单向数据绑定系统。
在控制器中填充您的Model,然后将其传递给View。
MVVM是一种双向数据绑定系统。
填充您的Model,在View中使用它,当View状态发生更改时,您的Model会自动更新。(反之亦然)