精通ASP.NET MVC——控制器和动作
在MVC框架中,控制器必須實(shí)現(xiàn)System.Web.Mvc命名空間的IController接口,如下圖所示:
//// 摘要:// 定義控制器所需的方法。public interface IController{//// 摘要:// 執(zhí)行指定的請求上下文。//// 參數(shù):// requestContext:// 請求上下文。void Execute(RequestContext requestContext);}這是一個很簡單的接口。唯一的方法Excute,在請求以控制器為目標(biāo)時被調(diào)用。但是發(fā)揮著重要的作用。?在Controller文件夾中創(chuàng)建一個新的名為“BasicController”的類文件,如下圖所示:
public class BasicController : IController{public void Execute(RequestContext requestContext){string controller = requestContext.RouteData.Values["controller"].ToString();string action = requestContext.RouteData.Values["action"].ToString();requestContext.HttpContext.Response.Write(string.Format("Controller:{0},Action:{1}", controller, action));}}IController接口的Execute方法被傳遞給System.Web.Routing.RequestContext對象,它提供關(guān)于請求和匹配路由的信息,如下圖所示:?
| 名稱 | 描述 |
| HttpContext | 返回一個描述當(dāng)前請求的 HttpContextBase 對象 |
| RouteData | 返回一個描述匹配請求的路由的RouteData對象 |
HttpContextBase對象對一組描述當(dāng)前請求的對象提供訪問。RouteData對象描述了路由,下圖描述了RouteData屬性:
| 名稱 | 描述 |
| Route | 返回匹配路由的RouteBase實(shí)現(xiàn) |
| RouteHandler | 返回處理路由的IRouteHandler |
| Values | 返回按名稱索引的片段值的集合 |
運(yùn)行效果如下圖所示:?
? ? ? ? ? ?
接受請求數(shù)據(jù):?
控制器經(jīng)常需要訪問來自于輸入的請求的數(shù)據(jù),如查詢字符串值,表單值,以及由路由系統(tǒng)根據(jù)輸入URL解析所得到得到參數(shù)。訪問這些數(shù)據(jù)有三個主要途徑:
1、通過一組上下文對象進(jìn)行提取。
2、作為參數(shù)被傳遞給動作方法而形成的的數(shù)據(jù)。
3、明確地調(diào)用框架的模型綁定特性。
?
當(dāng)控制器通過Controller基類派生而來的時候,使得到了一組便利屬性,可以用來訪問與請求相關(guān)的信息。這些便利屬性包括Request,Reponse,RouteData、HttpContext,以及Server。每一個屬性都包括了請求不同方面的信息,是因?yàn)槊恳粋€都是從請求的ControllerContext實(shí)例接受了不同類型的數(shù)據(jù)。這些屬性統(tǒng)稱為“便利屬性”如下圖所示:
?
| 屬性 | 類型 | 描述 |
| Request.QueryString | NameValueCollection | 隨該請求發(fā)送的GET變量 |
| Request.Form | NameValueCollention | 隨該請求發(fā)送的POST變量 |
| Request.Cookies | HttpCookieCollection | 由瀏覽器隨該請求發(fā)送的Cookies |
| Request.HttpMethod | sting | 用于該請求的HTTP方法(動詞,如GET或者POST) |
| Request.Headers | NameValueCollection | 隨該請求發(fā)送的整個HTTP報(bào)頭 |
| Request.Url | Url | 所請求的URL |
| Request.UserHostAddress | string | 形成該請求的用戶IP地址 |
| Request.Route | RouteBase | 為該請求所選擇的RouteTable.Routes條目 |
| RouteData.Values | RouteValueDictionary | 當(dāng)前路由的參數(shù)(從URL或默認(rèn)值提取) |
| HttpContext.Application | HttpApplicationStateBase | 應(yīng)用程序狀態(tài)庫 |
| HttpContext.Cache | Cache | 應(yīng)用程序緩存庫 |
| HttpContext.Items | IDictionary | 當(dāng)前請求的狀態(tài)庫 |
| HttpContext.Session | HttpSessionStateBase | 訪問者會話狀態(tài)庫 |
| User | IPrincipal | 已登錄用戶的認(rèn)證信息 |
| TempData | TempDataDictionary | 為當(dāng)前用戶存儲的臨時數(shù)據(jù)項(xiàng) |
?
動作結(jié)果?
MVC框架通過使用動作結(jié)果(Action Result)把指明意圖 和 執(zhí)行意圖分離開來。一般都是返回一個派生與ActionResult類的對象,它描述控制器相應(yīng)應(yīng)該要完成的功能。例如,渲染一個視圖,重定向到另一個URL或 動作方法等,在動作方法被執(zhí)行后,創(chuàng)建MVC框架處理的ActionResult對象以產(chǎn)生結(jié)果。MVC框架有許多內(nèi)建的動作結(jié)果類型,如下圖所示:
| 類型 | 描述 | 輔助器方法 |
| ViewResult | 返回指定的或默認(rèn)的視圖模板 | View |
| PartialViewResult | 返回指定的或默認(rèn)的分部視圖模板 | PartialView |
| RedireToRouteResult | 將HTTP 301或者302重定向發(fā)給一個動作方法或特定的路由條目,根據(jù)路由配置生成一個URL | RedirectToAction RedirectToActionPermanent RedirectToRoute RedirectToRoutePermanent |
| RedirectResult | 將HTTP301或302重定向發(fā)送給一個特定的URL | Redirect RedirectPermanent |
| ContentResult | 返回原始的文本數(shù)據(jù)給瀏覽器,隨意設(shè)置文本類型頭部 | Content |
| FileResult | 將二進(jìn)制(例如,磁盤文件或內(nèi)存字節(jié)數(shù)組)直接傳送給瀏覽器 | File |
| JsonResult | 將一個.NET對象序列化成JSON格式,發(fā)送給響應(yīng) | Json |
| JavaScriptResult | 發(fā)送一個由瀏覽器執(zhí)行的JavaScript源代碼偏度 | JavaScript |
| HttpUnauthorizedResult | 將響應(yīng)的HTTP狀態(tài)碼設(shè)置為401(意味“未授權(quán)”),這會引發(fā)當(dāng)前的認(rèn)證機(jī)制(表單認(rèn)證或Windows認(rèn)證)要求訪問者進(jìn)行登錄 | None |
| HttpNotFoundResult | 返回一個HTTP的“404——未找到”錯誤 | HttpNotFount |
| HttpStatusCodeResult | 返回一個指定的HTTP碼 | None |
| EmptyResult | 什么也不做 | None |
?
?
?
總結(jié)
以上是生活随笔為你收集整理的精通ASP.NET MVC——控制器和动作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git pull和push整理和归纳
- 下一篇: Xftp上传文件显示状态错误