在 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示例:
現在有同學可能會問了,第一個既然已經繼承了 Controller 基類,再在定義 Controller 的時候還要加 Controller 字尾不是多此一舉麼?這樣寫可不可以呢?
好吧,這樣子也是正确的。為什麼呢?這是因為繼承的基類 Controller 已經被打上了 ControllerAttribute 的标記,打上了這個标記之後,在建構掃描的時候就會被認為是一個 Controller,也就是說整個繼承樹已經被認為是一個有效的 MVC Controller 了。
那麼,有同學又問了,這樣可不可以呢?
這樣子是不行的,因為這是一個 POCO Controller,沒有任何标記使 MVC 架構會認為這是一個有效的Controller,這個時候,如果 如果想讓架構認為這是一個有效的 Controller,可以通過添加 ControllerAttribute 的方式:
這個時候,MVC 架構就會認為這是個有效的 Controller 了。
同樣的,這樣的代碼也是有效的,因為基類已經有了 ControllerAttribute 标記 :
還有一種可能性,就是當你有一個類,它恰好是以 Controller 結尾,但是實際上并不是一個 Controller 類怎麼辦呢? 這個時候,你就需要添加一個 NonControllerAttribute 标記,來聲明目前的類并不是一個 MVC 的 Controller 類,進而避免在建構的時候,架構會認錯。
有一點需要注意的是,NonControllerAttribute 标記比 ControllerAttribute 具有更高的優先級,是以當一個 Controller 同時具有這兩個标記的時候,會以 NonControllerAttribute 為準。
實際上,隻要是整個 Controller 繼承樹中有一個 Controller 被标記為 NonControllerAttribute 的時候,整個繼承樹的 Controller 均會被認為是無效的 Controller 了。
本文轉自zsdnr 51CTO部落格,原文連結:http://blog.51cto.com/12942149/1928956,如需轉載請自行聯系原作者