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详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
随机推荐
- var和let部分浅析
ES6中新增了let命令,用于声明变量,但所声明的变量只在let命令的代码块内有效. 举个例子: var a = []; for(var i=0;i<10;i++){ a[i] = functi ...
- C++程序设计实验考试准备资料(2019级秋学期)
程序设计实验考试准备资料 ——傲珂 #include<bits/stdc++.h> C++常用函数: <math.h>头文件 floor() 函数原型:double floor ...
- 【重大更新】AppWizard来了,emWin6.10版本来了
说明: 1.快圣诞节了,MDK和SEGGER都太生猛了,发布了大量软件更新,而且都是比较大的改进,待我周报再给大家分享. 2.不枉我这么多年对emWin的支持,官方也用心,终于带来AppWizard, ...
- C#程序编写高质量代码改善的157个建议【16-19】[动态数组、循环遍历、对象集合初始化]
前言 软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...
- HtEditor使用总结
最近在公司学习到ht编辑器的使用,关于使用方法上总结了一下,避免入坑.ht是做大屏数据可视化比较好的一款软件,不过多介绍,官网上有具体使用方法和展示样例,这里我整理一下我用的最多的功能. ##1.如何 ...
- github克隆项目缓慢
github浏览或者克隆项目的时候,总是十分缓慢,下面是亲自自测的一种方式,克隆速度可以稍快一些 第一步 访问域名解析网站:https://www.ipaddress.com/ 在网页下方可以看见一个 ...
- 林克的小本本之——HCL网络知识随笔
单臂路由 单臂路由是一种通过在路由器的一个接口上配置逻辑接口,来实现不同Vlan之间互通的方法. 实例: #配置SW1的VLAN [SW1]vlan 2 #配置端口vlan略 [SW1]int g1/ ...
- 【Linux 命令】cp 命令详解
Linux 命令之 cp 命令详解 一.cp 命令简介 cp 命令主要用于复制文件或目录.即用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp 命令可以将单个源文件复制成一个指定文件名的 ...
- Filter Lookup Editor Data Source 筛选器查找编辑器数据源
In this lesson, you will learn how to filter the data displayed by a lookup editor. This editor is s ...
- 一些实用的Django+HTML设置
一.关于引入变量 1.变量引入方法: {% block 块名称 %} <p>{{变量名}}<p> {% endblock %} 2.引入变量的值中标签是否转义: 不转义: {% ...