天天看點

9、ASP.NET MVC入門到精通——Controller(控制器)

Controller主要負責響應使用者的輸入。主要關注的是應用程式流,輸入資料的處理,以及對相關視圖(View)輸出資料的提供。

繼承自:System.Web.Mvc.Controller

一個Controller可以包含多個Action. 每一個Action都是一個方法, 傳回一個ActionResult執行個體

一個Controller對應一個xxController.cs控制檔案,對應在View中有一個xx檔案夾。一般情況一個Action對應一個View頁面

Action方法接收參數:

a.接收浏覽器傳過來的參數(get-兩種格式/post)

   a1.接收FormCollection Request.Form

 1.通過Request.Form["name"] 逐個擷取 表單送出的資料

在View視圖中

控制器中

注意:在View界面要存在name屬性為CusName的表單元素,因為送出表單資料的時候,隻會送出所有帶name标簽的資料。

 2.通過 FormCollection form逐個擷取 表單送出的資料

   a2.接收Model

通過 實體對象 一次性擷取 表單元素的資料,并設定到實體對象對應的屬性中

9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)

注意: 表單中的表單元素的屬性名稱必須和實體對象的屬性一樣!

折疊類中所有方法:ctrl+m+o 

折疊類中所有的代碼塊,包括類:ctrl+m+l

b.接收Get資料,Request.QueryString

直接通過請求上下文對象裡的 Request擷取 url ?後的的參數:

  浏覽器請求路徑為:/User/UserList/1?kjy=jp

  控制器擷取:Request.QueryString["kjy"];

Action方法輸出傳回值:

b1.string:直接 傳回響應封包字元串;

b2.ActionResult:傳回控制器結果對象

     (裡面會包含什麼呢?能做什麼呢?)

b3.JsonResult:傳回 Json 字元串

Action的傳回值-ActionResult

9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)

 Controller是如何向View進行資料傳輸的呢?

控制器将處理後的資料“傳”給視圖的方式

ViewData/ViewBag/TempData/Model

我們先來看下示例

控制器代碼:

9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)

View代碼:

9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)

大家可能覺得這十分顯而易見,結果肯定是

小李飛刀

陸小鳳

楚留香

謝曉峰

可是,我要告訴你,結果并不是像你想象的那樣,而是會顯示為這樣:

為什麼呢?因為ViewData和ViewBag本質上都是【ViewDataDictionary】類型,并且兩者之間的資料共享,隻不過提供了不同的文法操作方式而已。

是以“陸小鳳”覆寫了原先的值”小李飛刀“。

TempData,看名稱我們就知道,隻用來臨時存儲的,存儲一次就失效了,不會再共享啊什麼的。

打開我一直吐血推薦的犀利工具Reflector,我們來看下源碼

我們看到HomeController : Controller,public abstract class Controller : ControllerBase

9、ASP.NET MVC入門到精通——Controller(控制器)

發現,隻要從TempData中取出一個元素,就會立即将此元素移除!

9、ASP.NET MVC入門到精通——Controller(控制器)

在控制器裡的Action方法最後 調用View加載視圖的時候,将 資料對象傳入。

視圖中,可以通過 Model屬性擷取!并且不需要轉型就可以直接使用!

9、ASP.NET MVC入門到精通——Controller(控制器)

注意:Model雖然可以不轉型就直接使用,但是 因為編譯器無法在編譯時擷取它的類型,是以就無法出現智能提示!為了解決這個問題,我們可以在試圖的最上面通過代碼指定model類型

9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)
9、ASP.NET MVC入門到精通——Controller(控制器)

 如果沒有添加@model指令:目前視圖就會繼承于 WebViewPage<T> 強類型視圖頁面類,但T變成了 dynamic

到這裡,Controller的資料怎麼就傳到View了,我明明隻給Controller中的ViewData/ViewBag/TempData/指派了,或者隻把對象傳給了View方法。

為什麼View中就可以直接調用了呢?我們知道以前的ASP.NET,aspx和aspx.cs是一個繼承關系,子類可以直接調用父類的屬性方法。你ASP.NET MVC中View和Controller之間又有什麼關系呢?

View和Controller中都有ViewData/ViewBag/TempData這幾個對象,在給Controller中這些對象指派後,Controller會把這些值指派給View中對應的這幾個對象。

本文轉自鄒瓊俊部落格園部落格,原文連結:http://www.cnblogs.com/jiekzou/p/4780412.html,如需轉載請自行聯系原作者