您好,欢迎访问三七文档
第20章ASP.NETMVC应用程序本章重点路由控制器视图20.1MVC概述MVC是Model-View-Controller的缩写,即把一个Web应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求。模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。控制层并不做任何的数据处理。一个模型可能对应多个视图,一个视图可能对应多个模型。20.1MVC概述模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。20.1MVC概述MVC设计模式存在如下优点:1.可以为一个模型在运行时同时建立和使用多个视图。2.视图与控制器的可接插性,允许更换视图和控制器对象,甚至在运行期间进行对象替换。3.模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。4.潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。20.2ASP.NETMVCASP.NETMVC框架为创建基于MVC设计模式的Web应用程序提供了设计框架和技术基础。它是一个轻量级的、高度可测试的演示框架,并且它结合了现有的ASP.NET特性(如母版页等)。MVC框架被定义在Sytem.Web.Mvc命名空间,并且是被Sytem.Web命名空间所支持的。20.2ASP.NETMVCASP.NETMVC框架具有如下一些特性:1.ASP.NETMVC框架深度整合许多用户熟悉的平台特性,如运行时、身份验证、安全性、缓存和配置特性等。2.整个架构是基于标准组件的,所以开发人员可以根据自己的需要分解或替换每个组件。3.ASP.NETMVC框架使用用户熟悉的ASPX和ASCX文件进行开发,然后在运行时生成HTML的方式,并且实现了母版嵌套特性。4.在这个框架中,URL将不再映射到ASPX文件,而是映射到一些控制类(controllerclasses)。5..NETMVC框架实现了System.Web.IHttpRequest和IHttpResponse接口,这使得单元测试能力得到了增强。6.在进行测试时,不必再通过Web请求,单元测试可以撇开控制器而直接进行。7.可以在没有ASP.NET运行环境的机器上进行单元测试。20.2ASP.NETMVCASP.NETMVC框架应用程序则把URLs映射到服务器代码,它不是把URLs映射到ASP.NET页面或处理器,而是把URLs映射到控制器类。控制器类处理传入的诸如用户输入和交互请求,并执行相应的应用程序和数据逻辑,最后控制器类通常调用视图组件来生成HTML输出。通过项目模板“ASP.NETMVCWebApplication”创建ASP.NETMVC网站时,根据ASP.NETMVC框架的规定,ASP.NETMVC应用程序将模型、视图和控制器组件及其他内容分别放在不同的项目目录中,以便开发者维护和管理。20.2ASP.NETMVC利用ASP.NETMVC框架创建出的网站项目会自动生成这些文件夹和文件:1.App_Data文件夹它用来存储数据,与基于Web表单的ASP.NETWeb应用程序中的App_Data文件夹具有相同的功能。2.Content文件夹它存放应用程序需要的一些静态的资源文件,如图片、CSS样式文件等。3.Scripts文件夹它存放JavaScript等脚本文件。4.Models文件夹模型组件一般存放在Models文件夹中,例如LINQtoSQL类或者ADO.NETEntityDataModel就可以存放在该目录中,该目录还可以存放有关数据访问操作的一些类、对象的定义等。20.2ASP.NETMVC5.Views文件夹视图组件一般存放在Views文件夹中,可以存放的类型包括:.aspx页面、.ascx控件及.master母版页等。这里需要说明的是对每一个控制器,在View文件夹中都有一个与控制器对应的目录。6.Shared文件夹对于视图组件中的公用部分,可以创建一个名为“Shared”的文件夹,该目录不属于单个的控制器,而是属于所有的控制器,在Shared中可以存放母版页、CSS样式表等文件。7.Controllers文件夹控制器组件一般存放在Controllers文件夹中,控制器的命名约定采用XXXController的方式。20.2ASP.NETMVC在一个MVCWeb项目执行过程中,将经历如下几个阶段: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路由(URLRouting),指的是在基于ASP.NETMVC的网站中,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路由20.3.1定义路由路由的添加是在文件Global.asax的Application_Start事件的处理器函数中进行的,这样可以确保当应用程序启动时路由是可用的,并且在对应用程序进行单元测试时还支持直接调用该方法。如果想在单元测试应用程序时直接调用它,那么,必须把注册路由的方法设置为静态的,并且为其提供一个参数RouteCollection。通过把各个路由添加到RouteTable类的静态Routes属性中实现最终添加路由。其中,属性Routes是一个RouteCollection对象,它存储了ASP.NET应用程序所有的路由。20.3路由20.3.1定义路由文件Global.asax中的代码片断:protectedvoidApplication_Start(objectsender,EventArgse){RegisterRoutes(RouteTable.Routes);}publicstaticvoidRegisterRoutes(RouteCollectionroutes){routes.Add(newRoute(“Category/{action}/{categoryName}”//定义路由方式,newCategoryRouteHandler()//默认路由));}代码说明:添加了一个Route对象,此对象中定义了两个名字,分别为action和categoryName的URL参数。20.3路由20.3.2默认的路由当定义一个路由时,可以把一个默认的值赋给一个参数。如果URL中没有提供此参数值,那么将使用此默认值。为一个路由设置默认值,可以通过把一个字典赋值给Route类的Defaults属性来实现。Defaults=newRouteValueDictionary//默认的地址{{categoryName,food},{action,show}}}代码说明:创建了所定义的URL路由参数的默认值,即categoryNam变量的默认值是food,而Action方法则是对应控制器中的show方法。20.3路由20.3.3使用路由1.设定默认的URL路由在通过ASP.NETMVC项目模板所建立的一个基本MVC网站中,在Global.asax文件中就已经设定了默认的URL路由,以便我们即刻运行所建立的MVC网站:(1)默认的URL模式:{controller}/{action}/{id}默认值:action=IndexId=null(2)默认的URL模式:Default.aspx默认值:controller=Homeaction=IndexId=null2.添加路由添加路由最简单的方法是使用位于命名空间System.Web.Mvc中的RouteCollectionExtension静态类,在这个类中针对路由集合RouteCollection扩展了二个方法:(1)IgnoreRoute()方法主要用于设置不需要使用路由解析的URL地址,有二个重载的方法。(2)MapRoute()方法则用于设置各种的路径,一共有6个重载的方法。20.4构建模型在ASP.NETMVC框架中,模型主要实现应用程序中数据访问和业务逻辑,按照规定,这些模型类均存放在Models文件夹中。我们可以使用各种各样不同的技术来实现数据访问和业务逻辑。比如MicrosoftEntityFramework、NHibernate、Subsonic或者ADO.NET类来构建的数据访问类。最为常用的是LINQtoSQL类和ADO.NETEntityDataModel。20.5控制器在ASP.NETMVC中,控制器有着非常重要的作用,控制器处理用户的请求,将用户请求的URL路由,分发到控制器中的相关动作方法并执行适当的业务逻辑。控制器类通常调用一个单独的视图组件来生成HTML标记以对请求做出反应。20.5.1控制器类所有控制器的基类都是Controller类,这个类提供通用的MVC处理功能。Controller类实现了IController、IActionFilter和IDisposable接口。20.5控制器20.5.1控制器类Controller基类负责以下处理阶段:1.定位适当的行为方法。2.获取行为方法参数的值。3.处理在执行行为方法过程中可能出现的所有错误。4.提供默认的WebFormViewFactory类以用来渲染ASP.NET页面类型(视图)。以下代码展示了一个名为HomeController的控制器类的定义:publicclassHomeController:Controller{publicActionResultIndex(){ViewData[Mess
本文标题:MVC应用程序解读
链接地址:https://www.777doc.com/doc-3762758 .html