1.9 ASP.NET MVC技术专题
MVC是一种软件架构模式,模式分为3个部分:模型(Model)、视图(View)和控制器(Controller),MVC模式最早是由Trygve Reenskaug在1974年提出的,其特点是松耦合度、关注点分离、易扩展和维护,使前端开发人员和后端开发人员充分分离,不会相互影响工作内容与工作进度。而ASP.NET MVC是微软在2007年开始设计并于2009年3月发布的Web开发框架,从1.0版开始到现在的5.0版本,经历了5个主要版本改进与优化,采用ASPX和Razor这两种内置视图引擎,也可以使用其他第三方或自定义视图引擎,通过强类型的数据交互使开发变得更加清晰高效,强大的路由功能配置友好的URL重写。ASP.NET MVC是开源的,通过Nuget(包管理工具)可以下载到很多开源的插件类库。ASP.NET MVC是基于ASP.NET另一种开发框架。
1.9.1 ASP.NET MVC中的模型、视图和控制器
模型、视图和控制器是MVC框架的三个核心组件,其三者关系如图1.25所示。
(1)模型(Model):模型对象是实现应用程序数据域逻辑的部件。通常,模型对象会检索模型状态并执行储存或读取数据。例如,将Product对象模型的信息更改后提交到数据库对应的Product表中进行更新。
(2)视图(View):视图是显示用户界面(UI)的部件。在常规情况下,视图上的内容是由模型中的数据创建的。例如,对于Product对象模型可以将其绑定到视图上。除了展示数据外,还可以实现对数据的编辑操作。
(3)控制器(Controller):控制器是处理用户交互、使用模型并最终选择要呈现给用户的视图等流程控制部件。控制器接收用户的请求,然后处理用户要查询的信息,最后控制器将一个视图交还给用户。
图1.25 模型、视图和控制器的三者关系
1.9.2 什么是Routing
在ASP.NET WebForms中,一次URL请求对应着一个ASPX页面,ASPX页面又必须是一个物理文件。而在ASP.NET MVC中,一个URL请求是由控制中的Action方法来处理的。这是由于使用了URLRouting(路由机制)来正确定位到Controller(控制器)和Action(方法)中,Routing的主要作用就是解析URL和生成URL。
在创建ASP.NET MVC项目时,默认会在App_Start文件夹下的RouteConfig.cs文件中创建基本的路由规则配置方法,该方法会在ASP.NET全局应用程序类中被调用。
上面这段默认的路由配置规则匹配了以下任意一个Url请求:
http://localhost
http://localhost/Home/Index
http://localhost/Index/Home
http://localhost/Home/Index/3
http://localhost/Home/Index/red
URLRouting的执行流程如图1.26所示。
图1.26 URLRouting流程图
1.9.3 MVC的请求过程
当在浏览器中输入一个有效的请求地址,或者通过网页上的某个按钮请求一个地址时,ASP.NET MVC通过配置的路由信息找到最符合请求的地址,如果路由找到了合适的请求,访问先到达控制器和Action方法,控制器接收用户请求传递过来的数据(包括URL参数、Post参数、Cookie等),并做出相应的判断处理,如果本次是一次合法的请求并需要加载持久化数据,那么通过Model实体模型构造相应的数据。在响应用户阶段可返回多种数据格式,分别如下:
(1)返回默认View(视图),即与Action方法名相同。
(2)返回指定的View,但Action必须属于该控制器下。
(3)重定向到其他的View(视图)。
例如,当一个用户在浏览器中输入并请求了“http://localhost/Home/Index”地址,程序会先执行路由匹配,然后转到Home控制器,再进入Index方法中。下面是Home控制的代码片段:
定义在控制器中的Action方法默认返回的是一个ActionResult对象,ActionResult对象对Action执行结果进行了封装,用于最终对请求进行响应。ASP.NET MVC提供了一系列的ActionResult实现类来实现多种不同的响应结果。下面列举几个常用的ActionResult返回类型:
(1)View方法:返回ActionResult视图结果并将视图呈现给用户。参数可以返回Model对象。
(2)RedirectToAction方法:返回RedirectToRouteResult重定向动作结果,同类型的还有Redirect方法返回的RedirectResult结果。
(3)PartialView方法:返回PartialViewResult分部视图结果,视图文件应定义在View/Shared目录下。
(4)Content方法:返回ContentResult类型的用户定义的文本内容,此类型多用于Ajax请求需要返回的文本内容。
(5)Json方法:返回序列化JsonResult类型的JSON格式数据。同样,此方法多用于Ajax请求。需要注意的是如果Action是Get请求,则JSON方法的参数中必须传入JsonRequestBehavior.AllowGet,否则会因为避免暴露敏感信息而报出异常错误。
(6)JavaScript方法:返回可在客户端执行脚本的JavaScriptResult对象,但使用JavaScript方法时,需要两个必要的前提,即Ajax和jquery.unobtrusive-ajax.js。
(7)File方法:返回用于写入到响应中的二进制输出FileContentResult,一般可用于简单的下载功能。
(8)null:返回不执行任何操作结果的EmptyResult对象。