一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ASP.NET Core中的Controller

 小世界的野孩子 2021-04-04

ASP.NET CORE出現(xiàn)之前我們實現(xiàn)的Controller,MVC都繼承自Controller基類,WebApi的話繼承自ApiController。現(xiàn)在ASP.NET CORE把MVC跟WebApi合并了,已經(jīng)不再區(qū)分MVC或者WebApi。ASP.NET CORE的Controller繼承結(jié)構(gòu)也發(fā)生了變化。我們看其他示例的時候會發(fā)現(xiàn)有些繼承自Controller有些繼承自ControllerBase。事實上ControllerBase是Controller的基類。也就是說如果你繼承自Controller,其實就是繼承了ControllerBase。那什么時候該選擇直接繼承ControllerBase呢?

ControllerBase

我們先看看ControllerBase的元數(shù)據(jù):

很長并沒有截全??梢钥吹紺ontrollerBase是個抽象類,并且實現(xiàn)了大量的虛方法。這些虛方法大都是對應(yīng)了Http的狀態(tài)碼。
比如:

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設(shè)計的基類,所以當(dāng)你要設(shè)計一個Restful(web api)接口的時候可以選擇繼承自ControllerBase,它已經(jīng)可以滿足你的需求。

Controller

查看下Controller的元數(shù)據(jù):

Controller也是一個抽象類,繼承自ControllerBase,并且繼承了幾個接口。很明顯Controller比ControllerBase多的內(nèi)容主要是一些跟MVC打交道的東西。
比如:Viewbag、Viewdata屬性,Json、View方法等:

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

所以如果你是需要實現(xiàn)一個MVC系統(tǒng),想要使用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框架內(nèi)正常工作。ASP.NET CORE框架默認(rèn)會查找后綴為“Controller”的類,并把它當(dāng)做真正的Controller使用,在路由系統(tǒng)最終匹配Controller的時候它也會被嘗試匹配。

使用ControllerAttribute

如果你的控制器類有什么特別需求,連類名都不想加入“Controller”的后綴,那么還有一種方法就是使用ControllerAttribute。

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

運行一下:

POCO類并沒有繼承自任何類,并且也沒有“Controller”后綴命名,但是因為它被標(biāo)記了ControllerAttribute同樣會被ASP.NET CORE框架認(rèn)為是一個Controller。在路由系統(tǒng)最終匹配Controller的時候它也會被嘗試匹配。

使用NonControllerAttribute

如果你的一個類名恰巧包含“Controller”的后綴,但你并不想ASP.NET CORE框架發(fā)現(xiàn)它,你可以在類上加上NonControllerAttribute。這樣ASP.NET CORE框架就會忽略它。
改一下剛才的TestController,加上[NonController]:

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

運行一下:

/api/test已經(jīng)匹配不到controller了。

總結(jié)

  1. 設(shè)計restful(web api)接口的時候可以繼承ControllerBase
  2. 設(shè)計MVC系統(tǒng)的時候可以繼承Controller
  3. 當(dāng)一個POCO類名稱包含"Controller"后綴或添加ControllerAttribute的時候框架會認(rèn)為這是一個控制器
  4. 當(dāng)一個類不想被框架當(dāng)做控制器的時候可以添加NonControllerAttribute

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产精品亚洲综合天堂夜夜| 色婷婷视频国产一区视频| 夜夜嗨激情五月天精品| 亚洲国产成人av毛片国产| 日韩精品一级片免费看| 欧美亚洲国产日韩一区二区| 国产91麻豆精品成人区| 中文字幕亚洲精品在线播放| 久久精品亚洲精品一区| 日本女人亚洲国产性高潮视频| 国产精品一区二区三区欧美| 国产三级欧美三级日韩三级| 国产一级片内射视频免费播放 | 欧美偷拍一区二区三区四区 | 欧美日韩精品综合在线| 国产不卡一区二区四区| 亚洲中文字幕视频一区二区| 成年人视频日本大香蕉久久| 国产成人午夜av一区二区| 夫妻性生活一级黄色录像| 欧美欧美日韩综合一区| 欧美午夜伦理在线观看| 欧美激情中文字幕综合八区| 日韩高清一区二区三区四区 | 九九热九九热九九热九九热| 欧美日韩校园春色激情偷拍 | 午夜精品久久久免费视频| 日本成人三级在线播放| 人妻久久这里只有精品| 亚洲av又爽又色又色| 高潮少妇高潮久久精品99| 99久久人妻精品免费一区| 五月天丁香婷婷一区二区| 午夜亚洲少妇福利诱惑| 色综合久久超碰色婷婷| 欧美同性视频免费观看| 91偷拍与自偷拍精品| 日本免费一区二区三女| 亚洲精品黄色片中文字幕| 东京热电东京热一区二区三区| 日韩欧美国产精品中文字幕|