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的返回值类型等内容。
更多内容可访问我的个人博客:http://www.yunc.top/
ASP.NET MVC5基础-控制器(Controller)详解的更多相关文章
- ASP.NET MVC5基础-过滤器(Filters)详解
什么是过滤器? 过滤器的类型与作用 定义过滤器 授权过滤器 动作过滤器 结果过滤器 异常处理过滤器 过滤器的使用方法 总结 什么是过滤器? 通过上一篇关于Controller控制器的文章我们知道,MV ...
- ASP.NET MVC5基础 - Global.asax详解
简介 作用 Global.asax的处理事件 实例说明 总结 简介 Global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件 ...
- Kafka实战宝典:Kafka的控制器controller详解
一.控制器简介 控制器组件(Controller),是 Apache Kafka 的核心组件.它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群.集群中任意一 ...
- ASP.NET MVC5基础 – MVC文件架构
创建MVC项目 首先,我们使用Visual Studio2019创建一个MVC架构的应用程序.步骤如下:首先打开VS2019,在启动页选择[创建新项目].然后选择创建 ASP.NET Web 应用程序 ...
- Asp.Net MVC part2 View、Controller详解
View详解Razor视图引擎简介HtmlHelper强类型页面 Razor视图引擎简介强大的@:表示使用C#代码,相当于aspx中的<%%>可以完成输出功能当遇到html标签时会认为C# ...
- Kubernetes K8S之资源控制器StatefulSets详解
Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...
- Kubernetes K8S之资源控制器Daemonset详解
Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...
- 基础拾遗------redis详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 基础拾遗------webservice详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
随机推荐
- centos7 redis 6379端口telnet不通
1.查看redis服务是否启动,如图所示,redis已经启动 2.查看是否监听正确的ip和端口 发现问题:端口号6379没错,但是ip是127.0.0.1,表示只能本地访问,问题就出在这. 3.修改r ...
- java基础集合简介Map(三)下
--Map接口简介 今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢! 可 ...
- 浅析堆栈段,BBS段,数据段,代码段
文章目录 1. 进程,线程 2. 堆栈段 3. BBS段 4. 代码段 5. 数据段 6. 例子 7. 总结 1. 进程,线程 所谓进程是指在系统中能独立运行并作为资源分配的基本单位,程序段,数据段和 ...
- Android框架式编程之架构方案
目前移动端应用市场已经是百花齐放,很多独角兽公司都是通过App创业发展起来的,现在App类型更加丰富,功能越来越完善,基本上涵盖了各个行业的每个角落.为了开发出更加有竞争力的App,不仅需要功能上有创 ...
- 解决Android killer APK 编译失败,无法继续下一步签名
报错特征 在应用市场上下载了一个APK,使用Androd killer的编译的功能,结果报错了,报错信息如下: > ... 14 more APK 编译失败,无法继续下一步签名! 解决 解决 ...
- laravel身份验证-Auth的使用
laravel自带了auth类和User模型来帮助我们很方便的实现用户登陆.判断.首先,先配置一下相关参数 app/config/auth.php: model 指定模型table 指定用户表这里我只 ...
- Linux下执行脚本文件出现-bash: ./startup.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录
原因:脚本文件是在Windows环境下编辑的,windows环境下,每一行的结尾是\n\r,而Linux环境下,每一行结尾是\n.使用cat -A filename 可以看到每行的结尾后面多出了一 ...
- 详解串行通信协议及其FPGA实现
前言 好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了.本篇文章介绍,串口协议数据帧格式.串行通信的工作方式.电平标准.编码方式及Verilog实现串口发送一个字节数据和接收一个字节数 ...
- 极客时间-vue开发实战学习(ant-design vue作者)
vue基础 属性 事件 插槽 指令(Directives) 生命周期 底层原理 vue生态 路由管理器vue Router 状态管理器vuex 同构Nuxt vue实战 实战项目-ant-desing ...
- ionic项目打包+部署
环境: 1.ionic 2.angular-cli 开发 1.CTRL C + CTRL V 2.图片路径的问题 使用‘assets/xxxxx.jpg’,而不使用‘../../assets/xxx ...