介绍
模型-视图-控制器架构模式把一个应用程式分离成三个主要组件:模型、视图和控制器。ASP.NET MVC框架为ASP.NET使用Web-Forms模式开发基于MVC的网页应用程序提供了一个选择。ASP.NET MVC 框架是一个轻量级;表现层框架提供高度可测试;以及(像现在的基于Web-Froms的应用程式)整合了ASP.NET的现有特性,如Master Pages和基于Membership的验证。MVC 框架被定义在System.Web.Mvc命名空间,他的基础部分建立在System.Web 命名空间中。
MVC是一个许多开发者都非常熟悉的标准设计模式。某些类型的网页应用程式将会从MVC框架获取好处。其他的可以继续使用传统的基于WebForms和postback的ASP.NET应用程式模式。也有结合两种框架的Web程式,当然也有两者都不使用的。
MVC框架不使用ViewState和Forms。对于页面重视控件展现多于行为的应用程式,提供了一个理想的方案。
另一方面,基于表单的应用程式支持事件模型,在HTTP协议上可以保持状态,对于开发网页应用程式是非常有好处的。基于网页表单的应用程式提供了许多时间来支持许许多多的服务器控件。MVC使用Front Controller模式,使你在设计应用程式的时候可以完全分离表现层、业务逻辑以及数据访问,使控件按流程支持丰富的架构。网页表单程式使用 page-controller 模式,为个别页面分别添加功能。这两种可以按需混合使用。
MVC组件如下:
1、Models - Model对象是应用程式负责实现领域逻辑的部分。通常,Model对象可以在数据库获取或存储Model状态。举例,Product 对象从数据库获取信息,操作后,写入更新后的信息到SQL数据库的Products表。
注意:在一些更小型的程式来说,model通常是是概念上分离多于物理上的分离。举例,如果程式只是读取DataSet,并把它传送到view,程式并没有物理上的Model层和所关联的类。这种情况下,DataSet就担当着Model的角色。
2、Views - 视图是专职表现程式用户界面(UI)的组建。典型地说,UI从Model数据创建出来的。举例,现在有一个修改Products表的页面,它是根据当前Product对象的状态显示对应的文本框(textbox)、下拉框(dropdowlist)和勾选框(checkbox)。
3、Controllers - 控制器是负责用户交互,维护Model以及最终选择哪一个view去呈现数据UI的组件。在MVC应用程式中,视图只显示信息,控制器负责处理和回应用户的输入和交互。举例,控制器处理查询字符串(query-string )的值,传递这些值给model,然后就可以使用这些值实现轮流查询数据库。
MVC框架助你创建各个分离层的应用程式(输入逻辑、业务逻辑和UI逻辑),同时为各个元素提供了解耦。这种模式具体指定每一类的逻辑应该存在程式的哪里。UI逻辑是属于视图的。输入逻辑属于控制器。业务逻辑属于模型的。这样的分离有助于你管理建立复杂的应用程式,因为可以让你在一个时间内只关注程式的某一部分的实现。举例,你完全可以只关注视图而无需依靠业务层。
在管理复杂程式方面,MVC模式比传统的ASP.NET网页应用程式提供了更容易测试的程式。举例,在传统的ASP.NET网页应用程式,一个类就负责输出和输入两部分。编写传统ASP.NET网页应用程式的自动化测试是非常复杂的,因为要测试一个页面,你必须实例化一个页面的类和它的全部子控件,以及应用程式中所依赖的所有类。因为运行一个页面都需要许多类初始化,编写程式其中一部分的单独测试代码是非常困难的。而且,测试传统ASP.NET网页应用程式需要Web服务器。MVC 框架为组件和沉重的UI解耦,这样就有可能从框架其他部分分别为各组件进行测试。
解耦了MVC三个主要组件也促进了平行开发。举例,一个开发人员在view开发,第二个可同时在控制器业务层开发,第三个就关注业务逻辑模型。
ASP.NET MVC框架特性
ASP.NET MVC 框架提供以下特性:
1、分离程式的任务(输入逻辑、业务逻辑以及UI逻辑),可测试,以及默认测试驱动开发模式。在MVC框架内,所有核心协议都基于接口,便于使用mock数据进行测试。 你可以在ASP.NET进程中不运行控制器的情况下,进行快速和灵活的单元测试。你可以使用任何一个兼容.NET框架的单元测试框架。
2、框架具有扩展性和可插拔性。ASP.NET MVC 组件非常容易被替代或自定义。你可以组装你自定义的视图引擎,URL转向规则,action方法参数序列化,以及其它组件。ASP.NET MVC 框架提供了现成的依赖注入和IOC容器模型。
3、强大的URL映射,为你的应用程式提供通熟易懂、可搜索的链接。链接不必一定要文件扩展名,MVC框架支持URL“命名模式”,在SEO(search engine optimization )和REST(representational state transfer )定位中也工作得很好。举例,你可以映射“/products/edit/4”到你项目中的ProductsController类修改动作;或者映射“/Blogs/YourSite/10-10-2007/SomeTopic/”链接到BlogEngineController 类的DisplayPost 动作。URLs 无需与文件名称有关联。
4、在现有的ASP.NET页面(.aspx文件)、用户控件(.ascx文件)支持标记语言以及支持Master页面(.master文件)作为视图模板。你可以在使用ASP.NET MVC框架的同时使用现有的ASP.NET特性,如内嵌Master Page,嵌入表达式(<%=%>),声明式服务器控件,模板,数据绑定,本地化,等等。
5、支持现有的ASP.NET特性。ASP.NET MVC 可以使用特性如Forms和Windows的验证,URL验证,membership和roles,输出和数据缓存,Session和状态描述管理,监控健康状态,配置系统,provider的扩展架构,以及ASP.NET的其它领域。
后台
在ASP.NET网页,URL可以映射存在硬盘上的文件(如.aspx文件)。这些.aspx文件包括代码和标记,用于回应请求。
ASP.NET MVC框架用不同的方法映射链接到服务器代码。框架直接映射URL到控制器的类,代替映射URL到ASP.NET页面或使用handlers。控制器类处理引入的请求,如用户输入和用户交互,基于用户的输入以及执行相应的程式和数据逻辑。一般来说每一个控制器类调用一个视图组件,从而视图组件产生HTML输出。
ASP.NET MVC框架分离了Model,视图和控制器组件。模型组间一般使用在数据库的持久数据维护状态。控制器选择相应的视图组件,呈现适当的UI。大部分情况,ASP.NET MVC框架使用ASP.NET页面(.aspx)、用户控件(.ascx)、Master页面(.master)呈现页面到浏览器。控制器组件在控制器中定位适当的动作,使用动作方法的参数获得相应值,处理执行动作期间的所有异常,以及呈现所请求的视图。每一套的组件分别存在于MVC网页应用程式项目子目录。
URL映射
ASP.NET MVC框架包括一个URL映射的引擎,它提供了灵活的映射URL到控制器的类中。你可以使用映射引擎定义页面链接导航规则,ASP.NET MVC 框架会估计引进的URL和选择对应的控制器执行。你也可以让导航引擎自动添加变量定义到URL,ASP.NET MVC框架就会传递这些参数到控制器。
MVC 框架和Postbacks
ASP.NET MVC框架不会使用传统的ASP.NET postback模型来与服务器做交互。替代的是,所有的终端用户交互都由控制器控制。这样可分开维护UI逻辑和业务逻辑部分,有助于测试。这样导致的结果就是,ASP.NET 的视图状态、页面的生存周期事件都没有整个到基于MVC的视图当中。
创建ASP.NET MVC应用程式
ASP.NET MVC框架包括VS项目模板,让你创建支持MVC模式的网页应用程式。MVC Web Application 模板创建一个由子目录、模板、配置文件配置的网页应用程式,它们去全部都是ASP.NET MVC 程式所需要的部分。
默认情况下,当你使用模板创建新的网页应用程式的时候,Visual Studio 会创建一个解决方案和添加两个项目到解决方案。第一个项目就是实现你程式的网站项目,另外一个就是提供给你编写你的MVC组件单元测试的测试项目。
你可以使用任何兼容.NET框架的单元测试框架来测试ASP.NET MVC应用程式。Visual Studio 2008 Professional 包含了内置支持MSTest的测试项目。
了解MVC网页程式结构
当你创建ASP.NET MVC应用程式项目时,MVC组件基于以下的项目文件夹做分割:
1、视图文件夹。推荐视图文件夹内只存放视图。视图使用 .aspx, .ascx, 和 .master文件,当然其他任何文件也可以关联呈现视图。视图文件夹根据每一个控制器类的前缀而命名(如有Controller为“ProductsController”,View就有对应文件夹“Products”)。当加载视图时,默认地,ASP.NET MVC 框架会在Views\controllerName文件夹内寻找所请求的aspx文件视图名称。有一个叫“Common”的文件夹跟任何控制器没有关系。这个文件夹可用于定位存放master page、脚本、CSS文件以及呈现视图时要使用的其他文件。
2、控制器文件夹。推荐控制器文件夹内只存放控制器。
3、模型文件夹。推荐模型文件夹内只存放模型。一般来说,这里包含的代码就是定义与交互数据库的逻辑。
4、App_Data。数据的物理存储。这个文件夹与基于表单的ASP.NET网页应用程式作用相同。
在以上的文件夹之外,MVC还是用了以下的元素:
1、Global.asax 和 Global.asax.cs (在Visual Basic为 Global.asax.vb)。导航是在Application_Start 方法初始化的。以下示例展示Global.asax文件包含了默认的导航逻辑。
public class Global : System.Web.HttpApplication {
protected void Application_Start(object sender, EventArgs e) {
RouteTable.Routes.Add(new Route {
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
}
}
2、配置。MVC要在Web.Config注册HTTP handlers 和 HTTP modules。httpHandlers段注册MvcHandler类,用来导航请求到对应的控制器。以下示例显示httpHandlers段在ASP.NET MVC 的配置。
<httpHandlers>
<add verb="*" path="*.mvc" type="System.Web.Mvc.MvcHandler,
System.Web.Extensions, Version=3.6.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>
httpModules 段要注册UrlRoutingModule 类,强制URL导航到相应的处理者。这个入口允许程式在同一个项目是否使用MVC Handlers。以下示例显示httpModules段在ASP.NET MVC 的配置。
<httpModules>
<add name="UrlRoutingModule"
type="System.Web.Mvc.UrlRoutingModule,
System.Web.Extensions, Version=3.6.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35" />
</httpModules>
当你创建MVC程式的时候,方案已包含了测试项目。你可以使用MVC模板创建测试和创建mock来实现内置的接口。
了解MVC项目执行进程
使用MVC框架建立对网页的请求,通过 ASP.NET HTTP module 和 an HTTP handler进行导航。
注意
当MVC项目在IIS7运行的时候,无需注册任何文件后缀名。然而,在IIS6,处理器需要你映射.mvc文件后缀名到ASP.NET ISAPI DLL。
The module 和 handler 是指向 ASP.NET MVC框架的入口,会做以下动作:
1、在MVC项目中选择适当的控制器。
2、包含具体制定的控制器实例
3、呼叫控制器的方法
以下表格列出MVC项目执行场景:
Stage
|
Details
|
初次请求
|
在Gloabal.asax文件内,导向添加的RouteTable 对象。
|
导向
|
UrlRoutingModule 模块从在RouteTable实例中对应的Route 对象创建RouteData。 Route data 决定哪个控制器被请求,并且哪个方法被调用。
|
映射到控制器
|
MvcRouteHandler handler 根据RouteData实例中的数据,尝试创建控制器的类型。
|
调用控制器创建者
|
处理器调用ControllerBuilder 类的静态方法CreateController ,包含在IController 实例。
如果没有返回IController 实例,handler 会指定服务器返回HTTP500的错误。
|
创建控制器
|
ControllerBuilder 实例世界创建新的控制器实例,或者使用IControllerFactory 对象创建控制器。
|
执行控制器
|
MvcHandler 实例被添加到上下文,然后调用控制器的方法。
|