定義在Controller中的Action方法大都返回一個ActionResult對象。ActionResult是對Action執行結果的封裝,用於最終對請求進行響應。ASP.NET MVC提供了一系列的ActionResult。
HTTP是一個單純的采用請求/回復消息交換模式的網絡協議,Web服務器在接收並處理來自客戶端的請求後會根據處理結果對請求予以響應。對於來自客戶端的訪問請求,最終的處理體現在針對目標Action方法的執行,我們可以在定義Action方法的時候人為地控制對請求的響應。如果下面的代碼片斷所示,抽象類Controller具有一個只讀的Response屬性表示當前的HttpResponse,我們可以直接利用它來實現對請求的響應。我們也可以間接地通過表示當前HTTP上下文的HttpContext屬性和表示Controller上下文的ControllerContext屬性來獲取用於響應請求的HttpResponse對象。
1 public abstract class Controller : ControllerBase, ... 2 { 3 //其他成員 4 public HttpResponseBase Response { get; } 5 public HttpContextBase HttpContext { get; } 6 } 7 8 public abstract class ControllerBase : IController 9 { 10 //其他成員 11 public ControllerContext ControllerContext { get; set; } 12 }
原則上講,我們可以利用HttpResponse對請求響應作百分之一百地控制,但是我們一般並不這麼做,而是將針對請求的響應實現在一個ActionResult對象中。如下面的代碼片斷所示,ActionResult是一個抽象類型,最終的請求響應實現在抽象方法ExecuteResult方法中。
1 public abstract class ActionResult 2 { 3 //其他成員 4 public abstract void ExecuteResult(ControllerContext context); 5 }
顧名思義,ActionResult就是執行Action的結果。ActionInvoker在完成對Action方法的執行後,如果返回一個ActionResult對象,ActionInvoker會將當前Controller上下文作為參數調用其ExecuteResult方法。View的最終呈現是通過ActionResult的子類ViewResult來完成的,除了ViewResult,ASP.NET MVC還為我們定義了額外一些具體的ActionResult。
public ContentResult ContentResult() { return Content("123"); }
Json方法能返回一個JsonResult,此方法會把response.ContentType = "application/json"。默認情況下這種方式只支持post請求,若想允許get請求可以使用重載方法。
1 public JsonResult JsonResult() 2 { 3 var obj = new { id="123",name="rj"}; 4 5 return Json(obj, JsonRequestBehavior.AllowGet); 6 }
JavaScript方法實例化一個JavaScriptResult,JavaScriptResult只是簡單的設置response.ContentType = "application/x-javascript";
1 public JavaScriptResult JavaScriptResult() 2 { 3 return JavaScript("alert('123');"); 4 }
1 public FilePathResult FilePathResult() 2 { 3 string filename = Server.MapPath("/Image/622762d09a82581ea1ec9c77.jpg"); 4 return File(filename, "image/jpeg"); 5 }
返回局部視圖
重定向
RedirectToRouteResult同樣是產生跳轉的結果,但是它具有“路由表遍歷能力”,也就是具有Url outbound的特點