ASP.NET MVC5基础-控制器(Controller)详解
在上文asp.net mvc5基础 – mvc文件架构中我们简单了解了下控制器controller的作用,本文我将详细介绍控制器controller的使用方法。
controller的运行过程
上文我们已经讲到,控制器负责响应浏览器传送过来的所有请求。在mvc中,每一个浏览器请求都映射到一个控制器(controller)中,每个请求都会有个动作(action),只要动作存在,就可以通过该动作方法接收客户端传来的请求与决定响应的视图(view)。
我们以之前创建的mvc项目为例,打开项目的index.cshtml页面。
显示的界面如下:
可以看到,页面的地址栏url为:http://localhost:61515/home/index
根据路由规则,home是控制器(controller)名,index是动作(action)名。所以这个url调用的是homecontroller控制器下的index方法。
在index方法中,只有这么一行代码:return view();
,表示返回视图,然后返回给浏览器的是views/home文件夹下的index.cshtml页面。
虽然我们在index方法中没有指定返回哪个页面,但根据asp.net mvc的约定规则,控制器会找到views文件夹中,与controller名称相同文件夹下的同一方法名的页面。所以返回的是home下的index.cshtml页面。具体的有关控制器返回view的内容下文会详细说明。
控制器的运行过程大体如上,从浏览器请求到控制器返回结果的整体流程为:
controller请求参数处理
试想一下,我们在浏览器地址栏经常能看到url后面接很多个参数,比如百度搜索:https://www.baidu.com/s?ie=utf-8&wd=梦中的aoede 在url后面接了ie和wd两个参数,那么这种参数在mvc中是怎样获取的呢?
举个例子,我们给首页链接增加两个参数: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实体类来接收。在此我就不赘述了。
controller返回值说明
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过滤器
过滤器在mvc中也是个非常重要的概念,本文仅简单介绍下什么是过滤器,详细的内容我会在后续文章中深入说明。
过滤器(filters)就是向请求处理管道中注入额外的逻辑。
过滤器有不同类型,mvc支持的过滤器有:授权(authorization)、行为(action)、结果(result)和异常(四种),不同类型有不同的作用。
我们以授权(authorization)为例简单说明下。比如我们有个方法,只有登录用户才可以调用,那么我们只需要添加一个验证用户是否登录的授权过滤器,在对应的方法上方添加此过滤器的标记即可。
总结
通过本文可以了解到,controller的运行过程,controller中action如何获取参数、以及action的返回值类型等内容。
更多内容可访问我的个人博客:
推荐阅读
-
ASP.NET MVC5基础 – MVC文件架构
-
ASP.NET MVC5基础-控制器(Controller)详解
-
Asp.Net Core控制器如何接收原始请求正文内容详解
-
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
-
详解Asp.Net MVC——控制器与动作(Controller And Action)
-
ASP.NET MVC5基础 - Global.asax详解
-
asp.net MVC 在Controller控制器中实现验证码输出
-
SpringMVC 基础入门 Controller控制器实现的3种方式
-
详解如何在ASP.NET Core中编写高效的控制器
-
ASP.NET MVC从控制器传递数据到视图的四种方式详解