前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET Core中的Controller

ASP.NET Core中的Controller

作者头像
MJ.Zhou
发布2020-04-13 11:32:35
1.5K0
发布2020-04-13 11:32:35
举报
文章被收录于专栏:.NET开发那点事.NET开发那点事

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的状态码。 比如:

代码语言:javascript
复制
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方法等:

代码语言:javascript
复制
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可以正常工作吗?

代码语言:javascript
复制
    [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。

代码语言:javascript
复制
    [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]:

代码语言:javascript
复制
    [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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ControllerBase
  • Controller
  • POCO Controller
    • 使用“Controller”后缀
      • 使用ControllerAttribute
        • 使用NonControllerAttribute
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档