ASP.NET CORE出现之前我们实现的Controller,MVC都继承自Controller基类,WebApi的话继承自ApiController。现在ASP.NET CORE把MVC跟WebApi合并了,已经不再区分MVC或者WebApi。ASP.NET CORE的Controller继承结构也发生了变化。我们看其他示例的时候会发现有些继承自Controller有些继承自ControllerBase。事实上ControllerBase是Controller的基类。也就是说如果你继承自Controller,其实就是继承了ControllerBase。那什么时候该选择直接继承ControllerBase呢?

ControllerBase

我们先看看ControllerBase的元数据:



很长并没有截全。可以看到ControllerBase是个抽象类,并且实现了大量的虚方法。这些虚方法大都是对应了Http的状态码。

比如:

public virtual OkResult Ok(); //http status 200
public virtual NotFoundResult NotFound(); //http status 404
public virtual ForbidResult Forbid(); //http status 403
public virtual CreatedResult Created(Uri uri, [ActionResultObjectValue] object value); // http status 201
...还有很多很多...

显然这是为Restful Api设计的基类,所以当你要设计一个Restful(web api)接口的时候可以选择继承自ControllerBase,它已经可以满足你的需求。

Controller

查看下Controller的元数据:



Controller也是一个抽象类,继承自ControllerBase,并且继承了几个接口。很明显Controller比ControllerBase多的内容主要是一些跟MVC打交道的东西。

比如:Viewbag、Viewdata属性,Json、View方法等:

public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }
public virtual JsonResult Json(object data);
public virtual ViewResult View();
...

所以如果你是需要实现一个MVC系统,想要使用cshtml模板跟razor试图引擎渲染页面则需要继承Controller。

POCO Controller

除了继承Controller、ControllerBase之外,ASP.NET CORE框架可以让你的POCO类直接变成Controller。

使用“Controller”后缀

下面的代码,TestController可以正常工作吗?

    [Route("api/[controller]")]
public class TestController
{
[HttpGet]
public string Get()
{
return "TestController";
}
}

运行一下:



虽然TestController类并没有继承自任何类,但是他确实可以在ASP.NET CORE框架内正常工作。ASP.NET CORE框架默认会查找后缀为“Controller”的类,并把它当做真正的Controller使用,在路由系统最终匹配Controller的时候它也会被尝试匹配。

使用ControllerAttribute

如果你的控制器类有什么特别需求,连类名都不想加入“Controller”的后缀,那么还有一种方法就是使用ControllerAttribute。

    [Controller]
[Route("api/[controller]")]
public class POCO
{
[HttpGet]
public string Get()
{
return "POCOController";
}
}

运行一下:



POCO类并没有继承自任何类,并且也没有“Controller”后缀命名,但是因为它被标记了ControllerAttribute同样会被ASP.NET CORE框架认为是一个Controller。在路由系统最终匹配Controller的时候它也会被尝试匹配。

使用NonControllerAttribute

如果你的一个类名恰巧包含“Controller”的后缀,但你并不想ASP.NET CORE框架发现它,你可以在类上加上NonControllerAttribute。这样ASP.NET CORE框架就会忽略它。

改一下刚才的TestController,加上[NonController]:

    [NonController]
[Route("api/[controller]")]
public class TestController
{
[HttpGet]
public string Get()
{
return "TestController";
}
}

运行一下:



/api/test已经匹配不到controller了。

总结

  1. 设计restful(web api)接口的时候可以继承ControllerBase
  2. 设计MVC系统的时候可以继承Controller
  3. 当一个POCO类名称包含"Controller"后缀或添加ControllerAttribute的时候框架会认为这是一个控制器
  4. 当一个类不想被框架当做控制器的时候可以添加NonControllerAttribute

ASP.NET Core中的Controller的更多相关文章

  1. ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图

    原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...

  2. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  3. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  4. 在ASP.NET Core中使用百度在线编辑器UEditor

    在ASP.NET Core中使用百度在线编辑器UEditor 0x00 起因 最近需要一个在线编辑器,之前听人说过百度的UEditor不错,去官网下了一个.不过服务端只有ASP.NET版的,如果是为了 ...

  5. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  6. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  7. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  8. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  9. [转]ASP.NET Core 中的那些认证中间件及一些重要知识点

    本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系 ...

随机推荐

  1. CSS 文本截断方案

    单行截断 .ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 此方法兼容到ie6过.不过只能单行 ...

  2. C# Socket编程实现简单的局域网聊天器

    目录 前言 编码 服务端监听接口 客户端连接接口 文字发送接口 文件发送接口 信息接收接口(文字与文件) 使用 注意事项 源码 前言 最近在学习C# Socket相关的知识,学习之余,动手做了一个简单 ...

  3. Spring MVC启动流程分析

    本文是Spring MVC系列博客的第一篇,后续会汇总成贴子. Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目 ...

  4. 记 2020蓝桥杯校内预选赛(JAVA组) 赛后总结

    目录 引言 结果填空 1. 签到题 2. 概念题 3. 签到题 4. 签到题 程序题 5. 递增三元组[遍历] 6. 小明的hello[循环] 7. 数位递增[数位dp] 8. 小明家的草地[bfs] ...

  5. appium移动自动化详解

    1移动自动化简介 移动自动化就是通过代码来控制手机,模拟人的动作,对手机进行一些点击,输入等操作,那python代码如何能控制到手机呢?目前的思路应该是python代码->Appium-pyth ...

  6. JMeter脚本拷贝自动化

    方法一:DOC命令拷贝脚本(适合Windows系统) 1.写一段DOC命令(保存为批处理文件copyscript.bat),将本地JMeter脚本拷贝到远程机器上. net use \\<远程机 ...

  7. angular http 节流

    有时候点列表但是由于查询问题,后端返回数据的速度很慢,导致回来的顺序错乱,后端解决不了,前端来 在jq年代 像标志位 防抖 节流等 在angular里使用了rxjs //错误示范 getIntelli ...

  8. C# datagridview 格式化单元格内容

    private void dgvBig_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {  if (dgvB ...

  9. c# 自定义含有标题的容器控件(标题背景为渐变色)

    1.控件效果图 此效果图中的标题颜色.字号及字体可以在控件属性中设置.标题背景的渐变色及布局内容的背景色也可以在属性中设置. 2.实现的代码(用户控件) public partial class Uc ...

  10. jQuery常用事件,each循环,引用当前时间

    jQuery常用事件,each循环,引用当前时间 1.常用事件 click(function(){...}) #点击时触发hover(function(){...}) #鼠标移到时就触发blur(fu ...