ASP.NET MVC系列:ASP.NET MVC简介
1. MVC设计模式简介
MVC:Model-View-Controller,模型-视图-控制器,MVC是一种软件开发架构模式。
1.1 MVC设计模式结构
MVC设计模式三个基本组成部分之间关系如下图所示:
模型(Model):负责对整个软件项目数据和业务规则的封装。模型对象是应用程序中实现数据领域(Data Domain)逻辑的部分,从数据库中获取模型状态,并且将模型状态保存至数据库。
视图(View):负责给用户传递信息,并收集用户提交信息。
控制器(Controller):负责控制视图的展示逻辑。
1.2 MVC设计模式优点
1>. 支持多个视图(View)对应一个模型(Model)。
2>. 模型返回的数据不带任何显示格式,可直接应用于接口。
3>. 应用被分离为三层,可以尽量小的改动满足应用的调整。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。
1.3 MVC设计模式缺点
1>. 视图(View)与控制器(Controller)之间连接过于紧密
视图与控制器是相互分离,却是联系紧密的部件,不能独立重用。
2>. 视图(View)对模型(Model)数据访问低效
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。
2. ASP.NET MVC简介
ASP.NET MVC的官方网站为:http://www.asp.net/mvc
ASP.NET MVC框架是一个轻量的、高度可测试的表现层框架。
2.1 ASP.NET MVC框架特点
◊ 将应用程序分为Model、View和Controller,简化管理复杂性。
◊ 不适用ViewState或基于Server的Form。
◊ 使用Front Controller模式来处理对Web应用程序的请求,可以设计出支持丰富路由结构的程序。
◊ 更好支持测试驱动开发(Test Drive Development,TDD)
◊ 使用Page Controller模式为单个页面添加功能
2.2 ASP.NET MVC框架特点
◊ 应用程序任务分离(输入逻辑、业务逻辑和用户界面逻辑),增强可测试性,默认的测试驱动开发。MVC框架中的所有核心契约都是基于接口的,可以使用mock对象进行测试,mock对象是模拟的对象,模拟应用程序中实际对象的行为。对应用程序进行单元测试,而不需要在ASP.NET进程中运行Controller。
◊ ASP.NET MVC框架是一个可扩展和可插入的框架。ASP.NET MVC框架的组件设计为可以很容易地替换或者定制。可以嵌入自定义的视图引擎、URL路由策略、动作方法参数序列化,以及其他组件。ASP.NET MVC框架也支持使用依赖注入(Dependency Injection,DI)和控制倒置(Inversion of Control,IoC)容器模型。DI允许将对象注入到类中,而不是基于类来创建对象本身。IoC制定了如果一个对象需要另一个对象,第一个对象应该由外部源,例如配置文件,获得第二个对象。这使得测试更加容易。
◊ 强大的UrlRouting,允许创建拥有易于理解和便于搜索的URL的应用程序。URL不需要包含文件名扩展,有利于搜索引擎优化(SEO)和表现状态传输(representational state transfer)的URL命名模式。
◊ 支持现有的ASP.NET功能。ASP.NET MVC允许你使用例如表单验证和Windows验证、URL授权、成员资格和角色、输出和数据缓存、会话、配置系统和Provider架构等ASP.NET的功能。
2.3 ASP.NET MVC应用程序目录结构
ASP.NET MVC应用程序目录结构主要文件夹:
App_Data:数据物理存储区。
Content:存储项目内容文件,非动态非JavaScript文件,如css、图片等。
Controller:存储控制器。ASP.NET MVC框架要求所有控制器的名称均已Controller结尾。
Models:存储MVC Web应用程序模型类。此文件夹通常包括定义对象以及定义与数据交互所用的逻辑代码。通常,实际模型对象将位于独立的类库中。
Scripts:存储应用程序用到的脚本文件。
Views:存储视图。在Views文件夹中,每个控制器都具有一个文件夹,且该文件夹以控制器名称前缀命名。
2.4 ASP.NET MVC核心命名空间
ASP.NET MVC核心相关的命名空间:
System.Web.Routing:URL路由在该命名空间下提供了使用URL路由功能类,它可以将一个URL路由映射对应到Controller上,而不是映射到一个物理文件。
System.Web.Extensions:ASP.NET Ajax的命名空间,在MVC中使用Ajax功能时需要引用。
System.Web.Mvc:ASP.NET MVC最主要的命名空间。该命名空间包含一些类和接口,它们支持用于创建Web应用程序的ASP.NET MVC框架。该命名空间包含表示控制器、控制器工厂、操作结果、视图、部分视图以及模型编译等类。
System.Web.Abstractions:该命名空间包含一些相关的基类,例如HttpContextBase和HttpRequestBase等。
System.Web.DynamicData:该命名空间包含为ASP.NET动态数据提供核心功能的类。另外,它还提供允许自定义动态数据行为的扩展功能。
3. ASP.NET MVC应用程序执行过程
3.1 ASP.NET MVC应用程序执行过程
1>. 基于ASP.NET MVC的Web应用程序发出的请求;
2>. 通过UrlRoutingModule对象(Http模块)对请求进行解析,并且执行路由选择。UrlRoutingModule对象选择与当前请求所匹配的第一个路由对象。(路由对象是实现RouteBase的类,典型的是Route类的实例)。如果没有路由匹配,UrlRoutingModule对象什么也不做,并且让请求回退到IIS请求处理。
3>.从所选择的Route对象中,UrlRoutingModule对象获取与Route对象相关的IRouteHandler对象。在ASP.NET MVC应用程序中,这是一个MvcRouteHandler的实例。IRouteHandler实例创建一个IHttpHandler对象,并向它传递IHttpContext对象。默认情况下,MVC的IHttpHandler实例是一个MvcHandler对象。
4>.MvcHandler对象选择Controller,该Controller最终处理请求。
3.2 ASP.NET MVC应用程序执行阶段
执行阶段 | 细节描述 |
---|---|
收到应用程序的第一个请求 | 在Global.asax文件中,Route对象添加到RouteTable对象中。 |
执行路由 | UrlRoutingModule模块使用RouteTable集合中的第一个匹配的Route对象来创建RouteData对象,该对象然后被用来创建RequestContext(IHttpContext)对象。 |
创建MVC请求处理器 | MvcRouteHandler对象创建一个MvcHandler类的实例,并且将RequestContext实例传递给它。 |
创建Controller | MvcHandler对象使用RequestContext实例来识别出IControllerFactory对象(默认是DefaultControllerFactory类的实例),来创建Controller实例。 |
调用Action | 大多数控制器都继承自Controller基类。对于这些控制器来说,与控制器相关的ControllerActionInvoker对象决定调用控制器类的哪一个Action方法,然后调用。 |
执行结果 | Action方法接收用户输入,通过返回一个结果类型来执行结果。可执行的结果包括:ViewResult,RedirectToRouteResult、RedirectResult、ContentResult、JsonResult和EmptyResult。 |