1. 程式人生 > >Asp.Net Mvc 控制器詳解

Asp.Net Mvc 控制器詳解

emp 不能 例如 繼續 quest 同時 修改 元數據 感覺

理解控制器

控制器的角色

(1)中轉作用:控制器通過前面的學習大家應該知道它是一個承上啟下的作用,根據用戶輸入,執行響應行為(動 作方法),同時在行為中調用模型的業務邏輯,返回給用戶結果(視圖)。

(2)中介角色:分離視圖和模型,讓視圖和模型各司其職,控制器賦值二者交互。只負責數據傳送,不負責處理。 控制器的兩種角色可以用下圖來表示:

技術分享圖片

深入理解控制器類

(1)觀察控制器類的元數據。前面我們一直用控制器,在最初我們也簡單說過控制器必須繼承 Controller 類,那麽 Controller 類究竟還有哪些密碼需要我們進一步研究呢。其實我們通過查看 Controller 類的元數據,就能夠發現, 如下圖所示:

技術分享圖片

(2)ControllerBase 類需要理解的內容:

? Controller 類位於 System.Web.Mvc 命名空間,繼承自 ControllerBase 類。

? ControllerBase 類實現了 Icontroller 接口的 Execute 方法,在路由器搜索到相應的控制器後,就會調用 Execute 方法進入控制器的處理。

(3)ControllerBase 的屬性:

  • ControllerContext:獲取或設置控制器上下文。
  • ValidateRequest:獲取或設置一個值,該值指示伺服為此請求啟用請求驗證。
  • ValueProvider:獲取或設置控制器的值。
  • ViewData:獲取或設置數據的字典。
  • ViewBag:獲取動態視圖數據字典。
  • TempData:獲取或設置可以在不同控制器之間傳遞數據的字典。

(4)ControllerBase 的任務:

  • 定位:找到對應的動作方法。
  • 獲取參數:獲取動作方法的參數。
  • 處理錯誤:在執行動作方法中可能出現的錯誤。
  • 渲染視圖:提供默認的 WebFormViewFactory 類來渲染 ASP.NET 視圖。

動作方法的參數

獲取表單的常規方法

回顧我們以前在動作方法中獲取 URL 和表單數據的方法,代碼如下:

技術分享圖片

請大家思考,除了上面的方法外,還有沒有更好的方法呢?答案是有的,請大家繼續看下面的新方法。

動作方法參數的映射:

(1):)參數映射的基本使用: 其實,在 ASP.NET MVC 框架中,給我們提供了非常好的獲取參數的方法,那就是可以 通過參數映射的形式直接獲取參數值,而無需再像上面那樣單獨獲取,只要我們提交的參數名稱(比如文本框的 name)和我們定義的動作方法參數一致基本就可以,下面我們先看一個例子:

技術分享圖片

(2)參數映射的好處: 通過上面可以看出,我們省去了參數獲取的步驟,這樣在參數較多的時候開發效率是非常明 顯的。

(3)動作方法參數映射來源,如下表所示:

技術分享圖片

(4)動作方法參數映射要求: 第一,參數名要和目標數據參數名一致(不區分大小寫)。

技術分享圖片

值類型參數映射問題

(1)值類型參數有時候會失敗,我們來做一個測試:比如,我們要求用戶輸入用戶名和密碼後登錄,但是用戶只是 輸入了密碼,沒有輸入用戶名,那麽提交後會有什麽結果呢?

技術分享圖片

技術分享圖片

(2)原因分析:是因為 int 類型的參數,必須有數據才行,因為用戶從視圖中傳遞的數據是 null,而參數映射的時候 是無法將 null 轉換成 int 類型。所以,大家明白這個道理,我們只需要將參數 int 類型定義成可為空類型 int?即可。

技術分享圖片

提示:雖然我們定義了可為空類型,但是並不是說我們開發中以後可以隨便的使用帶?的可為空類型,比如實際開 發中,我們肯定會有驗證,也就是說用戶登錄 ID 是不會為 null 的,剛才我們只是這樣一個測試,如果您在寫項目 時,確實前端不需要驗證,也允許為空,而後臺是值類型,這時候就用剛才我們給出的方法解決是最完美的。

映射模型

(1)問題思考:前面的參數映射雖然解決了獲取參數的麻煩,但是請思考,如果參數還是很多怎麽辦?如下圖所示:

技術分享圖片

(2)解決思路:按照我們面向對象編程的規範,一個方法的參數是不能過多的,3-4 個就已經不少了,再多就不方便了, 於是我們在基礎課程階段告訴大家了解決方法,那就是使用實體類來解決!非常好,有了實體類,在動作方法中,我 們照樣能夠使用!

(3)使用模型映射的基本步驟:第一,獲取表單數據;第二,自動構造實體模型,第三,調用業務邏輯方法並傳遞 模型。具體代碼實現如下:

技術分享圖片

(4)模型映射的總結。通過上面的例子,您應該感覺出來了,模型自動映射最關鍵的就是參數的 name 一定要和實 體類的屬性一致,因為在自動構造模型的時候,就是根據這個參數 name 對應到實體類的屬性,這個非常關鍵。

動作方法特性與 ActionResult

動作方法同名問題

我們知道普通的方法可以同名,也就是使用重載的方法,那麽一個控制器的動作方法能不能也重名呢,我們接下來 做一個測試,在一個控制器中添加兩個同名的動作方法,然後運行程序,代碼如下:

技術分享圖片

技術分享圖片

結果發現,路由不鞥呢根據方法參數去定位動作方法!那這個問題如何解決呢?我們繼續往下研究、

動作方法的特性應用

(1)Http 請求謂詞特性:針對請求類型定位方法,這樣就能解決同名沖突問題,那我們先看特性的類型和具體使用 方法,如下圖所示:

技術分享圖片

技術分享圖片

按照以上方法,再次運行程序就不會出現前面的問題了,因為兩個不同的動作方法,會針對不同的請求來響應,這 樣就不會爭奪同一個請求。

(2)關於 Http 謂詞:特點是經常使用,如果不加上該特性,默認動作方法接收所有謂詞的請求,一般開發中都會加 上謂詞,限定請求謂詞類型。

(3)NonAction 特性:特點是可以將控制器中的方法聲明為“非動作方法”,對於控制器內部使用的方法非常有用, 加上該特性後,外部不能訪問,即可解決同名沖突問題。示例如下:

技術分享圖片

(4)ActionName 特性:特點是為動作方法“重新命名”,解決同名方法沖突問題,視圖中使用時,需要修改成“重 新命名”後的方法。示例如下:

技術分享圖片

Asp.Net Mvc 控制器詳解