ASP.NET Core MVC 中的 [Controller] 和 [NonController]

来源:http://www.cnblogs.com/savorboard/archive/2016/09/20/dotnet-controller-2.html
-Advertisement-
Play Games

前言 我們知道,在 MVC 應用程式中,有一部分約定的內容。其中關於 Controller 的約定是這樣的。 每個 Controller 類的名字以 Controller 結尾,並且放置在 Controllers 目錄中。 Controller 使用的視圖是在 Views 主目錄的一個子目錄中,這個 ...


前言

我們知道,在 MVC 應用程式中,有一部分約定的內容。其中關於 Controller 的約定是這樣的。

  • 每個 Controller 類的名字以 Controller 結尾,並且放置在 Controllers 目錄中。
  • Controller 使用的視圖是在 Views 主目錄的一個子目錄中,這個子目錄是根據控制器名稱(後面減去Controller尾碼)來命名的。

明白了以上約定之後,就來一起看看下麵吧。

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 了。


本文地址:http://www.cnblogs.com/savorboard/p/dontnet-controller.html
作者博客:Savorboard
歡迎轉載,請在明顯位置給出出處及鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、簡單控制項 ①label 作用是顯示文字,編譯後的結果是span 邊框--邊框顏色,邊框樣式,邊框粗細 ②literal 作用是顯示文字,編譯後的結果不會生成任何元素,主要是用於傳遞JavaScript代碼 ③TextBox 文字輸入框 TextMode--SingleLine 被編譯為 type ...
  • 1.資料庫名為Demo,數據結構如圖 2.後臺代碼如下 ...
  • 1. 類和結構能夠實現介面 2. 介面聲明包含如下四種類型:屬性、方法、事件和索引;這些函數聲明不能包含任何實現代碼,而在每一個成員的主體後必須使用分號 3. 繼承介面的類或結構必須實現介面中的所有成員 4. 顯示介面的實現註意下麵的代碼 ...
  • 走進非同步編程的世界 - 在 WinForm 中執行非同步操作 序 這是繼《開始接觸 async/await 非同步編程》、《走進非同步編程的世界 - 剖析非同步方法》後的第三篇。主要介紹在 WinForm 中如何執行非同步操作。 目錄 在 WinForm 程式中執行非同步操作 在 WinForm 中使用非同步 L ...
  • 背水一戰 Windows 10 之 控制項(進度類): RangeBase, Slider, ProgressBar, ProgressRing ...
  • 配置針對應用程式的運行狀況監視的一個服務 配置節內容比以往的較為複雜,如下 實際上這是運行狀況監視是一個事件定義與處理的模型,簡單來看整個運行狀況監視基本點有以下三個 1.在eventMappings定義事件 2.在providers定義事件的處理 3.通過rules綁定事件給某個處理程式去處理。 ...
  • Awesome系列的.Net資源整理。awesome-dotnet是由quozd發起和維護。內容包括:編譯器、壓縮、應用框架、應用模板、加密、資料庫、反編譯、IDE、日誌、風格指南等。 API 框架 NancyFx:輕量、用於構建 HTTP 基礎服務的非正式(low-ceremony)框架,基於.N ...
  • 代碼: 方法一:窗體的代碼-->可以直接通過預設的Click事件來實現控制進度條。 方法二:通過調用其他類里的方法來實現對進度條的控制。 註意一:需要using System.Windows.Forms; 註意二:進度條ToolStripProgressBar的許可權需要改成Public 效果圖:(左 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...