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