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