.NET 4.0 framework支持MVC3.0 用VS2008的只能使用MVC 2.0
VS2008安装MVC2.0 http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html
需要说明的是ASP.NET MVC只是给开发者提供了开发web应用程序的一种选择,而绝不是替代传统ASP.NET WebForms技术,这两种技术在不同的应用场景中,具有不同的优缺点,开发者需要根据自己的实际情况,选择对应的技术,甚至在同一个项目中混合使用这两种技术。
从上图可以看出,ASP.NET MVC与ASP.NET WebForm是建立在ASP.NET基础上的两种平行的技术,是微软今后同时发展的两种Web开发技术。
既然这样为什么要使用ASP.NET MVC呢?
主要是由于WebForm开发难以测试,虽然它的使用非常方便,然而微软构建了一个非常复杂的引擎,从而给页面的执行过程带来了许多负面效应,开发者很难了解这背后的HTML是如何运作的。同时如果没有合理控制ViewState的话,很容易得到一个包含大量ViewState的页面,使得该页面的尺寸远远超过所需的内容,最终页面打开的速度非常缓慢,随着web应用越来越复杂化,不容易测试也越来越成为实际应用开发中的一个棘手问题。
微软2007.12发布了ASP.NET 3.5 MVC预览版,2009.3.18发布了ASP.NET 3.5 MVC 1.0版本。MVC避免了WebForm所带来的复杂性,没有数据回传,没有ViewState,开发者可以完全掌握页面呈现的全过程,使用模型、视图、控制器将web应用划分到不同组建中,有利于开发人员与设计人员的分工,提高了程序的可维护性和扩展性,特别是有利于web应用程序的测试,可以比较容易地实施测试驱动开发。其他特点包括:易于单元测试、支持WebForm中的有关特性(如视图模版中支持各种当前的aspx页面,用户控件ascx,母板页master,嵌套母板页,内联表达式,数据绑定,本地化,成员、角色管理、数据缓存等)
基本概念
模型----前面学的LINQ to SQL类就是一个模型,类似的还有ADO.NET Entity Data Model(ADO.NET实体数据模型),它们都是模型,它们实现的是传统三层架构的数据访问层和业务逻辑层的任务。但有时一些应用程序并不使用这些ORM框架,所以对于这些应用程序而言,模型是概念上的,此时被读取的数据就是模型。模型组件一般被存放在Models文件夹中。
视图----视图就是用于显示模型中数据的用户界面,一般来说视图就是HTML页面。视图组建一般被存放在Views文件夹中。
控制器----用于处理用户的输入或交互命令,以便改变模型的状态,选择适当的视图来显示对应模型的数据。控制器组件一般被存放在Controllers文件夹。
当用户在浏览器中输入浏览地址,获得页面的反馈结果,一般需要经过以下5个结果:
1.用户输入浏览地址,发出页面请求,实际上是向控制器发出相关的命令。
2.控制器接收到用户请求命令后,向模型请求获得相关的数据。
3.模型将对应的数据返回给控制器。
4.控制器将有关的数据发送到指定的视图。
5.指定的视图呈现被指定的数据。
在传统的WebForm中,URL通常被映射为保存在磁盘上的一个文件,而在MVC中,URL不再被映射为一个文件,URL首先被映射到一个控制器中,该控制器处理用户的输入,选择适当的模型,获得相关数据,然后调用视图组件显示指定的数据,并返回到用户界面。
约定的目录结构
Models、Views、Controllers、App_Data、Scripts、Content(可用来存放静态文件如样式文件、图片等)、Shares(视图组件的公用部分,该目录不属于单个控制器,而属于所有控制器,可以存放母板页、错误页面、用户控件等)
Controllers里面就是控制器组件,都是些****Controller.cs的类文件,它们里的****Controller类必须实现Icontroller接口或继承抽象类Controller类。而对于每一个****Controller.cs在Views里面必须有一个名为****的文件夹与之对应。也就是说每一个****目录都属于相应的****Controller控制器。如下图的AccountController--Account、HomeController--Home
我们来看看HomeController里写了些什么
也许你已经发现了在Views里的Home目录里有Index.aspx和About.aspx恰巧与HomeController里的这两个方法名相同,没错,****Controller控制器里返回值类型是ActionResult的方法名对应的就是该控制器所管的Views下的****目录里的aspx页面。
这些方法被称为动作方法,它们处理用户的请求,执行其中相关的代码,例如检索或更新数据库中的数据,然后选择相关的视图,将内容输出到浏览器中。这些方法的返回类型是ActionResult,它是一个抽象类,因此实际返回的是该抽象类的子类,ActionResult的子类见下图:
上图中return View();语句中的View()方法是一个控制器方法,返回的是一个ViewResult实例化对象,将指定的内容输出到浏览器中。
其他控制器方法与其对应的返回对象如下图:
其他必要知识
MVC使用了Global.asax,并在该文件的Application_Start()方法中设置了URL路由,以及相关路由逻辑。
MVC还通过配置文件注册了专门的HTTP模块,在httpModules节中,注册了UrlRoutingModule类,用于解析URL的路由。
执行过程
用户请求的URL地址首先被传递到UrlRoutingModule模块,该模块解析URL地址,然后选择相关的URL路由,并得到对应的IHttpContext对象来处理该URL路由。在默认情况下,该IHttpContext对象就是MvcHandler对象。通过MvcHandler对象选择相关的控制器来处理用户的请求。
因此UrlRoutingModule模块和MvcHandler对象是MVC网站的入口点,它们主要实现1.选择适当控制器 2.获得指定控制器的一个实例化对象 3.调用指定控制器中的相关方法。
下图说明了MVC页面请求的执行过程:
传统WebForm中每一个被请求页面都对应着一个文件,这些页面类都实现了IHttpHandler接口,每当一个页面被请求时,就会调用该类的ProcessRequest()方法,之后返回指定内容到浏览器中。
MVC中每一个被请求页面都被映射到相应的控制器中的相应方法,控制器负责将指定内容返回到浏览器中。而页面到控制器的映射是通过路径表(Route Table)实现的,每一个MVC程序都有一个路径表,路径表是通过RouteTable。Routes属性表示的。我们来看看它的设置,在Global.asax文件里:
路径表中添加了1个路由对象,该路由对象实现URL到MvcRouteHandler的映射,将具有{controller}/{Action}/{id}模式的URL映射到MvcRouteHandler。
请求一个MVC页面时,由UrlRoutingModule模块解析该URL,并获得相关的RouteData对象。然后创建HttpHandler的实例化对象MvcHandler,执行MvcHandler的ProcessRequest()方法从而创建一个控制器的实例化对象,然后调用该控制器对象的Execute()方法,在该方法内部通过反射原理实现对其指定的其他方法的调用,在调用的方法中会执行View()方法,从而将指定页面的内容返回到浏览器中。