文章目錄
一、理解控制器
中轉作用
- 承上啓下,根據用戶輸入,執行響應行爲(動作方法)
- 在行爲中調用模型的業務邏輯,並返回給用戶結果(視圖)
中介角色
- 分離視圖和模型,讓視圖和模型各司其職,控制器賦值二者交互
- 只負責數據的傳送,不負責處理
控制器類
所有的控制器的基類都是Controller,而Controller類重點就是提供ASP.NET MVC網站進行的http請求的方法
而Controller自身具有的基類是ControllerBase
ControllerBase類
- Controller類位於System.Web.Mvc命名空間,繼承自ControllerBase類
- ControllerBase類實現了Icontroller接口的Execute方法,在路由搜索到相應的控制器及動作方法,Execute方法進入控制器的處理
屬性
- ControllerContext:獲取或設置控制器上下文
- ValidateRequest:獲取或設置一個值,該值指示是否爲此請求啓用請求驗證
- ValueProvider:獲取或設置控制器的值
- ViewData:獲取或設置數據的字典
- ViewBag:獲取動態視圖數據字典
- TempData:獲取或設置可以在不同控制器之間傳遞數據的字典
任務
- 定位:找到相應的動作方法
- 獲取參數:獲取動作方法的參數
- 處理錯誤:在執行動作方法中可能出現的錯誤
- 渲染視圖:提供默認的WebFormViewFactory類來渲染ASP.NET視圖
二、動作方法的參數
動作方法參數映射
- 在動作方法中使用“參數映射”,參數會自動匹配
- 參數映射的好處:再也不需要手工獲取參數並做類型轉換,在多個參數時非常明顯
映射參數的來源
來源 | 優先級 | 說明 |
---|---|---|
表單數據 | 高 | s 表單提交的數據(Request.Form) |
路由數據 | 中 | 路由數據(RouteData.Values) |
URL數據 | 低 | URL數據(Request.QueryString) |
參數自動映射,按照優先級依次查找參數
動作方法參數要求
- 動作方法的參數必須和數據模型中的屬性類型、名稱保持一致(大小寫不區分)
- 視圖中的表單name屬性值或URL中鍵值對名稱和數據模型中屬性名稱保持一致
- 滿足三方面的命名一致才能實現參數映射
- 如果視圖中表單或URL或路由數據只要能夠確保是一個數據模型,那麼就能夠在動作方法中直接使用這個數據模型對象作爲參數
值類型參數映射失敗
解決方案:可以將值類型定義爲可空類型,可選參數
三、動作方法的特性
例如控制器中出現動作方法重載
路由系統不能根據方法參數去定位動作方法
1.Http請求特性
針對請求類型定位方法,解決同名衝突問題
特性名 | 說明 |
---|---|
HttpGet | 針對Get請求 |
HttpPost | 針對Post請求 |
HttpDelete | 針對Delete請求 |
HttpPut | 針對Put請求 |
關於Http謂詞
- 特點:經常使用,如果不加上該特性,默認動作方法接收所有謂詞的請求
- 一般開發中都會加上謂詞,限定請求謂詞類型
NonAction特性
- 可以將控制器中的方法聲明爲“非動作方法”
- 對於控制器內部使用的方法非常有用,加上該特性後,外部不能訪問,也可以解決同名方法衝突問題
ActionName特性
- 爲動作方法“重命名”,解決同名方法衝突問題
- 視圖中使用時,需要修改成“重新命名”後的方法
注意:當動作方法應用了ActionName特性後,如果動作方法內部使用View()方法調用視圖,(也就是不指定視圖名稱),則調用的是和ActionName值相同的視圖,而不再是原動作方法名稱視圖
四、ActionResult詳解
ActionResult和View()
所有的View()方法返回的都是ViewResult對象
名稱 | 說明 |
---|---|
View() | 創建一個將視圖呈現給響應的ViewResult對象 |
View(Object) | 使用模型創建一個將視圖呈現給響應的ViewResult對象 |
View(string) | 使用視圖名稱創建一個呈現視圖的ViewResult對象 |
View(IView) | 創建一個呈現指定的IView對象的ViewResult對象 |
View(string,object) | 使用模型創建一個指定視圖名稱的ViewResult對象 |
View(string,string) | 使用視圖名稱和母版頁名稱創建一個將視圖呈現給響應的ViewResult對象 |
View(IView,object) | 創建一個呈現指定的IView對象的ViewResult對象 |
View(string,string,object) | 使用視圖名稱、母版頁、和模型創建一個呈現視圖的ViewResult |
返回值是一個抽象類,體現了多態性,多態性解決了實際開發中響應結果爲html、文件等不同內容的輸出
五、動作方法輸出內容
當客戶端不需要輸出HTML,而是文件、文本內容等該怎麼辦
輸出類型 | 說明 | 控制器輸出的方法 |
---|---|---|
EmptyResult | 沒有返回值,動作方法不需要輸出 | 無 |
ContentResult | 將指定內容作爲文本輸出 | Conten(string) |
JsonResult | 輸出JSON字符串 | Json(object) |
JavaScriptResult | 輸出JavaScript文件 | JavaScript(string) |
RedirectResult | 指定的URL來執行重定向 | Redirect(string) |
RedirectToRouteResult | 指定路由值來執行查詢 | RedirectToAction(string) |
FilePathResult | 指定文件路徑來輸出文件 | File(string ,string) |
FileContentResult | 指定字節數組來輸出文件 | File(byte[],string) |
FileStreamResult | 指定流來輸出文件 | File(Stream,string) |
ViewResult | 調用視圖文件輸出視圖 | View() |
六、隱式動作類型
- 動作方法返回值類型可以是ActionResult以外的任意類型
- 類型說明
int類型—>ContentResult類型
void類型—>EmptyResult類型