在上文ASP.NET MVC5基础 – MVC文件架构中咱们简单了解了下控制器Controller的做用,本文我将详细介绍控制器Controller的使用方法。html
上文咱们已经讲到,控制器负责响应浏览器传送过来的全部请求。在MVC中,每个浏览器请求都映射到一个控制器(Controller)中,每一个请求都会有个动做(Action),只要动做存在,就能够经过该动做方法接收客户端传来的请求与决定响应的视图(View)。浏览器
咱们以以前建立的MVC项目为例,打开项目的Index.cshtml页面。架构
显示的界面以下:mvc
能够看到,页面的地址栏URL为:http://localhost:61515/Home/Index
框架
根据路由规则,Home是控制器(Controller)名,Index是动做(Action)名。因此这个URL调用的是HomeController控制器下的Index方法。3d
在Index方法中,只有这么一行代码:return View();
,表示返回视图,而后返回给浏览器的是Views/Home文件夹下的Index.cshtml页面。code
虽然咱们在Index方法中没有指定返回哪一个页面,但根据ASP.NET MVC的约定规则,控制器会找到Views文件夹中,与Controller名称相同文件夹下的同一方法名的页面。因此返回的是Home下的Index.cshtml页面。具体的有关控制器返回View的内容下文会详细说明。htm
控制器的运行过程大致如上,从浏览器请求到控制器返回结果的总体流程为:对象
试想一下,咱们在浏览器地址栏常常能看到URL后面接不少个参数,好比百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=梦中的Aoede 在URL后面接了ie和wd两个参数,那么这种参数在MVC中是怎样获取的呢?blog
举个例子,咱们给首页连接增长两个参数:http://localhost:61515/Home/Index?name=梦中的Aoede&age=18
。
那么在Index方法中,正常状况咱们能够经过Request.QueryString获取到这两个参数。以下:
public ActionResult Index() { var name = Request.QueryString["name"]; var age = Request.QueryString["age"]; return Content($"name:{name},age:{age}"); }
打开http://localhost:61515/Home/Index?name=梦中的Aoede&age=18
,显示以下:
其实在MVC中,参数的传递是经过模型绑定(Model Binding)机制从RequestContext中获取到参数数据的。获取到数据以后再将数据传入到方法的参数中,因此咱们只须要在方法中增长两个参数便可,以下:
public ActionResult Index(string name,int age) { return Content($"name:{name},age:{age}"); }
打开页面输出结果仍是同样的:
相同的,若是浏览器经过POST方式传过来一个表单,那么咱们也能够在Index参数中使用表单对应的Model实体类来接收。在此我就不赘述了。
Action处理完请求后,会将结果返回给客户端。Action返回的结果咱们称为动做结果(Action Result)。
全部的动做结果都继承自ActionResult基类,以HomeController中的Index方法为例,它return的View()就是一个ViewResult类,ViewResult类也是ActionResult的子类。
ASP.NET MVC框架支持六种标准类型的动做结果:
动做名称 |
概述 |
方法名 |
---|---|---|
ViewResult |
视图内容,HTML或标记 |
View |
EmptyResult |
空内容 |
|
RedirectResult |
重定向到新的URL |
Redirect |
RedirectToRouteResult |
重定向到新的控制器 |
RedirectToAction/RedirectToRoute |
JsonResult |
返回一个JSON(Javascript Object Notation)内容 |
Json |
ContentResult |
返回文本内容 |
Content |
须要注意的是,虽然控制器返回的是动做结果(Action Result),但在代码中,咱们调用的是Controller基类中的方法。在上文的表中有对应的方法名。
除了以上六种动做结果之外,你还能够给Action方法返回其余类型的返回值,这个返回值会自动被包装在ContentResult中。好比这段代码:
public class HomeController : Controlle { public DateTime Index() { return DateTime.Now; } }
Index返回的是DateTime对象,而在浏览器中,显示的是一个日期字符串。
过滤器在MVC中也是个很是重要的概念,本文仅简单介绍下什么是过滤器,详细的内容我会在后续文章中深刻说明。
过滤器(Filters)就是向请求处理管道中注入额外的逻辑。
过滤器有不一样类型,MVC支持的过滤器有:受权(Authorization)、行为(Action)、结果(Result)和异常(四种),不一样类型有不一样的做用。
咱们以受权(Authorization)为例简单说明下。好比咱们有个方法,只有登陆用户才能够调用,那么咱们只须要添加一个验证用户是否登陆的受权过滤器,在对应的方法上方添加此过滤器的标记便可。
经过本文能够了解到,Controller的运行过程,Controller中Action如何获取参数、以及Action的返回值类型等内容。
更多内容可访问个人我的博客:http://www.yunc.top/