0571杭州新闻:ASP.NET Core中的Controller

admin 6个月前 (04-13) 科技 65 0

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
,

Sunbet

Sunbet www.4008981981.com Sunbet(www.sunbet.red)是进入Sunbet亚太地区站点。Sunbet开放Sunbet会员开户网址、Sunbet代理开户、Sunbet手机版下载、Sunbet电脑客户端下载等业务。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:0571杭州新闻:ASP.NET Core中的Controller

标签列表

    文章归档

      站点信息

      • 文章总数:465
      • 页面总数:0
      • 分类总数:8
      • 标签总数:804
      • 评论总数:0
      • 浏览总数:13467