资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,20,章,ASP.NET MVC,应用程序,本章重点,路由,控制器,视图,20.1 MVC,概述,MVC,是,Model-View-Controller,的缩写,即把一个,Web,应用的输入、处理、输出流程按照,Model,、,View,、,Controller,的方式进行分离,这样一个应用被分成三个层,模型层、视图层、控制层。,视图(,View,)代表用户交互界面,对于,Web,应用来说,可以概括为,HTML,界面,但有可能为,XHTML,、,XML,和,Applet,。对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求。,模型(,Model,):就是业务流程,/,状态的处理以及业务规则的制定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。,控制(,Controller,)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。控制层并不做任何的数据处理。一个模型可能对应多个视图,一个视图可能对应多个模型。,20.1 MVC,概述,模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化,-,传播机制。,20.1 MVC,概述,MVC,设计模式存在如下优点:,可以为一个模型在运行时同时建立和使用多个视图。,视图与控制器的可接插性,允许更换视图和控制器对象,甚至在运行期间进行对象替换。,模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。,潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。,20.2 ASP.NET MVC,ASP.NET MVC,框架为创建基于,MVC,设计模式的,Web,应用程序提供了设计框架和技术基础。它是一个轻量级的、高度可测试的演示框架,并且它结合了现有的,ASP.NET,特性(如母版页等)。,MVC,框架被定义在命名空间,并且是被,Sytem.Web,命名空间所支持的。,20.2 ASP.NET MVC,ASP.NET MVC,框架具有如下一些特性:,ASP.NET MVC,框架深度整合许多用户熟悉的平台特性,如运行时、身份验证、安全性、缓存和配置特性等。,整个架构是基于标准组件的,所以开发人员可以根据自己的需要分解或替换每个组件。,ASP.NET MVC,框架使用用户熟悉的,ASPX,和,ASCX,文件进行开发,然后在运行时生成,HTML,的方式,并且实现了母版嵌套特性。,在这个框架中,,URL,将不再映射到,ASPX,文件,而是映射到一些控制类(,controller classes,)。,.NET MVC,框架实现了,和,IHttpResponse,接口,这使得单元测试能力得到了增强。,在进行测试时,不必再通过,Web,请求,单元测试可以撇开控制器而直接进行。,可以在没有,ASP.NET,运行环境的机器上进行单元测试。,20.2 ASP.NET MVC,ASP.NET MVC,框架应用程序则把,URLs,映射到服务器代码,它不是把,URLs,映射到,ASP.NET,页面或处理器,而是把,URLs,映射到控制器类。控制器类处理传入的诸如用户输入和交互请求,并执行相应的应用程序和数据逻辑,最后控制器类通常调用视图组件来生成,HTML,输出。,通过项目模板,“,ASP.NET MVC Web Application,”,创建,ASP.NET MVC,网站时,根据,ASP.NET MVC,框架的规定,,ASP.NET MVC,应用程序将模型、视图和控制器组件及其他内容分别放在不同的项目目录中,以便开发者维护和管理。,20.2 ASP.NET MVC,利用,ASP.NET MVC,框架创建出的网站项目会自动生成这些文件夹和文件:,1.App_Data,文件夹,它用来存储数据,与基于,Web,表单的,ASP.NET Web,应用程序中的,App_Data,文件夹具有相同的功能。,2.Content,文件夹,它存放应用程序需要的一些静态的资源文件,如图片、,CSS,样式文件等。,3.Scripts,文件夹,它存放,JavaScript,等脚本文件。,4.Models,文件夹,模型组件一般存放在,Models,文件夹中,例如,LINQ to SQL,类或者,ADO.NET Entity Data Model,就可以存放在该目录中,该目录还可以存放有关数据访问操作的一些类、对象的定义等。,20.2 ASP.NET MVC,5.Views,文件夹,视图组件一般存放在,Views,文件夹中,可以存放的类型包括:,.aspx,页面、,.ascx,控件及,.master,母版页等。这里需要说明的是对每一个控制器,在,View,文件夹中都有一个与控制器对应的目录。,6.Shared,文件夹,对于视图组件中的公用部分,可以创建一个名为,“,Shared,”,的文件夹,该目录不属于单个的控制器,而是属于所有的控制器,在,Shared,中可以存放母版页、,CSS,样式表等文件。,7.Controllers,文件夹,控制器组件一般存放在,Controllers,文件夹中,控制器的命名约定采用,XXXController,的方式。,20.2 ASP.NET MVC,在一个,MVC Web,项目执行过程中,将经历如下几个阶段:,1.,获取第一个请求。在,Global.asax,文件中,,Route,对象被添加到,RouteTable,对,象中。,2.,执行路由。,UrlRoutingModule,对象使用,RouteTable,集合中第一个匹配的,Route,对象以创建,RouteData,对象,利用这个对象以生成,RequestContext,对象,(,IHttpContext,对象)。,3.,创建,MVC,请求处理。,MvcRouteHandler,对象创建一个,MvcHandler,类的实,例,并把它传递到,RequestContext,实例。,4.,创建控制器。,MvcHandler,对象使用,RequestContext,实例去确认,IControllerFactory,对象以创建控制器实例。,5.,执行控制器。,MvcHandler,实例调用控制器的可以执行方法。,6.,触发行为。很多控制器都继承自,Controller,基础类,而同控制器结合在一,起的,ControllerActionInvoker,对象来决定控制器类调用哪个方法并调用这个,方法。,7.,执行结果。一个典型的行为方法可能接收用户输入,准备适当响应数,据,并通过返回一个结果类型来执行结果。,20.3,路由,URL,路由(,URL Routing,),指的是在基于,ASP.NET MVC,的网站中,,URL,不再是文件目录中的一个文件,而是一个说明有关,URL,路由的字符串,开发者可以自行定义该字符串的格式,方便使用者理解相关的页面功能。,20.3.1,定义路由,定义,URL,路由,就是设置,URL,模式。在,URL,路由中,通过大括号,“,”,定义占位符,这些占位符就是,URL,路由的参数,而字符中的,“,/,”“,.,”,等符号则被作为分隔符被,URL,路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。比如:,controller/action/id /,有效的,URL,路由定义,/Products/show/beverages /,匹配的路由,代码说明:定义了含有,3,个,URL,路由参数的,URL,路由,此时,Products,就是控制器的名称,,show,就是该控制器中所定义的一个方法,而,beverages,则是一个,id,变量。,20.3,路由,定义路由,路由的添加是在文件,Global.asax,的,Application_Start,事件的处理器函数中进行的,这样可以确保当应用程序启动时路由是可用的,并且在对应用程序进行单元测试时还支持直接调用该方法。,如果想在单元测试应用程序时直接调用它,那么,必须把注册路由的方法设置为静态的,并且为其提供一个参数,RouteCollection,。,通过把各个路由添加到,RouteTable,类的静态,Routes,属性中实现最终添加路由。其中,属性,Routes,是一个,RouteCollection,对象,它存储了,ASP.NET,应用程序所有的路由。,20.3,路由,定义路由,文件,Global.asax,中的代码片断:,protected void Application_Start(object sender,EventArgs e),RegisterRoutes(RouteTable.Routes);,public static void RegisterRoutes(RouteCollection routes),routes.Add(new Route(,“,Category/action/categoryName,”,/,定义路由方式,new CategoryRouteHandler()/,默认路由,);,代码说明:添加了一个,Route,对象,此对象中定义了两个名字,分别为,action,和,categoryName,的,URL,参数。,20.3,路由,20.3.2,默认的路由,当定义一个路由时,可以把一个默认的值赋给一个参数。如果,URL,中没有提供此参数值,那么将使用此默认值。为一个路由设置默认值,可以通过把一个字典赋值给,Route,类的,Defaults,属性来实现。,Defaults=new RouteValueDictionary/,默认的地址,categoryName,food,action,show,代码说明:创建了所定义的,URL,路由参数的默认值,即,categoryNam,变量的默认值是,food,而,Action,方法则是对应控制器中的,show,方法。,20.3,路由,20.3.3,使用路由,1.,设定默认的,URL,路由,在通过,ASP.NET MVC,项目模板所建立的一个基本,MVC,网站中,在,Global.asax,文件中就已经设定了默认的,URL,路由,以便我们即刻运行所建立,的,MVC,网站,:,(,1,)默认的,URL,模式,:controller/action/id,默认值:,action=Index Id=null,(,2,)默认的,URL,模式,:Default.aspx,默认值:,controller=Home action=Index Id=null,2.,添加路由,添加路由最简单的方法是使用位于命名空间中的,RouteCollectionExtension,静态类,在这个类中针对路由集合,RouteCollection,扩展了二个方法,:,(,1,),IgnoreRoute(),方法主要用于设置不需要使用路由解析的,URL,地址,,有二个重载的方法。,(,2,),MapRoute(),方法则用于设置各种的路径,一共有,6,个重载的方法。,20.4,构建模型,在,ASP.NET MVC,框架中,模型主要实现应用程序中数据访问和业务逻辑,按照规定,这些模型类均存放在,Models,文件夹中。,我们可以使用各种各样不同的技术来实现数据访问和业务逻辑。比如,Microsoft Entity Framework,、,NHibernate,、,Subsonic,或者,ADO.NET,类来构建的数据访问类。,最为常用的是,LINQ to SQL,类和,ADO.NET Entity Data Model,
展开阅读全文