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