ASP.NET Core MVC 中的 [Controller] 和 [NonController]
Controller VS NonController 中內(nèi)置的約定
在 ASP.NET Core MVC 中已經(jīng)統(tǒng)一了 MVC 和 Web Api 及 Web Pages, 他們具有相同的 Controller ,并且在 RC2 之后的版本中,ASP.NET Core MVC 支持了 POCO Controller,所以你在做一個(gè) Web Api 的 Controller 的時(shí)候不需要再繼承自 Controller 基類。
POCO Controller 即 public 的,非抽象的,沒有任何繼承,不實(shí)現(xiàn)任何接口的 Controller 類,類似于 POCO Class,僅僅是以 Controller 結(jié)尾而已。
到這里,有些同學(xué)可能會(huì)問了,在 POCO Controller 中如果我想獲取 HTTP 上下文的一些東西應(yīng)該怎么獲取呢? 嗯?。。。 這確實(shí)是個(gè)問題。。。。怎么辦呢? 老實(shí)的繼承基類 Controller 吧,因?yàn)?Vnext 中的 POCO Controller 屬性注入已經(jīng)被取消了。
如果你創(chuàng)建了一個(gè) POCO Controller ,那么他們的名字必須以 Controller 結(jié)尾,只有這樣他們才是一個(gè)有效的 Controller,不然的話,MVC 不會(huì)認(rèn)為你這是一個(gè) Controller 對(duì)象。即使你具有 Route 之類的標(biāo)記也不可以。
所以,在創(chuàng)建一個(gè) MVC Controller 的時(shí)候,就有兩個(gè)先決條件:
-
-- 繼承自 Controller 基類
-
-- 或者使用一個(gè)以 Controller 結(jié)尾的名字
下面是創(chuàng)建兩種 Controller 的一個(gè) Web Api Controller示例:
[Route("api/[controller]")]public?class?FooController?:?Controller{[HttpGet]????public?string?Get()????{????????return?"foo";} }[Route("api/[controller]")]public?class?BarController{[HttpGet]????public?string?Get()????{????????return?"bar";} }現(xiàn)在有同學(xué)可能會(huì)問了,第一個(gè)既然已經(jīng)繼承了 Controller 基類,再在定義 Controller 的時(shí)候還要加 Controller 后綴不是多此一舉么?這樣寫可不可以呢?
[Route("api/[controller]")]public?class?Foo?:?Controller{[HttpGet]????public?string?Get()????{????????return?"foo";} }好吧,這樣子也是正確的。為什么呢?這是因?yàn)槔^承的基類 Controller 已經(jīng)被打上了 ControllerAttribute 的標(biāo)記,打上了這個(gè)標(biāo)記之后,在構(gòu)建掃描的時(shí)候就會(huì)被認(rèn)為是一個(gè) Controller,也就是說整個(gè)繼承樹已經(jīng)被認(rèn)為是一個(gè)有效的 MVC Controller 了。
那么,有同學(xué)又問了,這樣可不可以呢?
[Route("api/[controller]")]public?class?Bar{[HttpGet]????public?string?Get()????{????????return?"bar";} }這樣子是不行的,因?yàn)檫@是一個(gè) POCO Controller,沒有任何標(biāo)記使 MVC 框架會(huì)認(rèn)為這是一個(gè)有效的Controller,這個(gè)時(shí)候,如果 如果想讓框架認(rèn)為這是一個(gè)有效的 Controller,可以通過添加 ControllerAttribute 的方式:
[Controller] [Route("api/[controller]")]public?class?Bar{[HttpGet]????public?string?Get()????{????????return?"bar";} }這個(gè)時(shí)候,MVC 框架就會(huì)認(rèn)為這是個(gè)有效的 Controller 了。
同樣的,這樣的代碼也是有效的,因?yàn)榛愐呀?jīng)有了 ControllerAttribute 標(biāo)記 :
[Controller]public?class?ApiBase?{}[Route("api/[controller]")]public?class?Bar?:?ApiBase{[HttpGet]????public?string?Get()????{????????return?"bar";} }還有一種可能性,就是當(dāng)你有一個(gè)類,它恰好是以 Controller 結(jié)尾,但是實(shí)際上并不是一個(gè) Controller 類怎么辦呢? 這個(gè)時(shí)候,你就需要添加一個(gè) NonControllerAttribute 標(biāo)記,來聲明當(dāng)前的類并不是一個(gè) MVC 的 Controller 類,從而避免在構(gòu)建的時(shí)候,框架會(huì)認(rèn)錯(cuò)。
[NonController]public?class?DemoController{????//?非?action?代碼}有一點(diǎn)需要注意的是,NonControllerAttribute 標(biāo)記比 ControllerAttribute 具有更高的優(yōu)先級(jí),所以當(dāng)一個(gè) Controller 同時(shí)具有這兩個(gè)標(biāo)記的時(shí)候,會(huì)以 NonControllerAttribute 為準(zhǔn)。
實(shí)際上,只要是整個(gè) Controller 繼承樹中有一個(gè) Controller 被標(biāo)記為 NonControllerAttribute 的時(shí)候,整個(gè)繼承樹的 Controller 均會(huì)被認(rèn)為是無效的 Controller 了。
本文轉(zhuǎn)自zsdnr ?51CTO博客,原文鏈接:http://blog.51cto.com/12942149/1928956,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core MVC 中的 [Controller] 和 [NonController]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】如何修改Chrome缓存目录的地址
- 下一篇: ADO.NET 数据连接查询