程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 了解ASP.NET MVC幾種ActionResult的本質 第四篇

了解ASP.NET MVC幾種ActionResult的本質 第四篇

編輯:關於ASP.NET

HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

在本系列的最後一篇,我們來討論最後三個ActionResult:HttpStatusCodeResult、RedirectResult和RedirectToRouteResult 。第一個用於實現針對某個HTTP狀態的響應,而後兩個用於實現重定向。至於重定向,又分為“暫時重定向”和“永久重定向”,按照響應狀態,又稱“302重定向”和“301重定向”。

一、HttpStatusCodeResult

每一個HTTP響應均具有一個表示響應狀態的代碼和一個可選的狀態描述,正常情況下返回“200 OK”。System.Web.Mvc.HttpStatusCodeResult使我們很容易地返回一個指定狀態的HTTP響應。如下面的代碼片斷所示,HttpStatusCodeResult具有StatusCode和StatusDescription兩個只讀的屬性分別表示響應狀態碼和狀態描述信息。在構造函數中既可以將狀態碼設置成一個整數,也可以以HttpStatusCode枚舉形式來指定狀態碼。

   1: public class HttpStatusCodeResult : ActionResult
2: {
3: public HttpStatusCodeResult(int statusCode);
4: public HttpStatusCodeResult(HttpStatusCode statusCode);
5: public HttpStatusCodeResult(int statusCode, string statusDescription);
6: public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);
7:
8: public override void ExecuteResult(ControllerContext context);
9:
10: public int StatusCode { get; }
11: public string StatusDescription { get;}
12: }

HttpStatusCodeResult實現在ExecuteResult方法中的請求響應邏輯很簡單,如下面的代碼片斷所示,它僅僅是設置了當前HttpResponse的StatusCode和StatusDescription而已。有一點值得一提的是,如果我們采用Visual Studio的Development Server作為Web應用的宿主,通過HttpStatusCodeResult的StatusDescription屬性設置的狀態描述信息不會反映HTTP響應中,只有采用IIS作為宿主才會真正將此信息寫入響應消息。

   1: public class HttpStatusCodeResult : ActionResult
2: {
3: //其他成員
4: public override void ExecuteResult(ControllerContext context)
5: {
6: context.HttpContext.Response.StatusCode = this.StatusCode;
7: if (this.StatusDescription != null)
8: {
9: context.HttpContext.Response.StatusDescription = this.StatusDescription;
10: }
11: }
12: }

HttpStatusCodeResult具有兩個子類,一個基於響應狀態“404, Not Found”的System.Web.Mvc.HttpNotFoundResult,另一個是基於響應狀態“401, Not Authorized”的System.Web.Mvc.HttpUnauthorizedResult,第7章“Action的執行”中篩選器AuthorizeAttribute在授權檢驗失敗的情況下返回的就是一個HttpUnauthorizedResult對象。

二、RedirectResult

RedirectResult幫助我們實現針對某個地址的重定向,其作用與調用HttpResonse的Redirect/RedirectPermanent方法完全一致。如下面的代碼片斷所示,RedirectResult具有兩個只讀屬性Permanent和Url,前者表示采用永久重定向還是暫時重定向,默認值為False,後者表示重定向的目標地址,既可以采用絕對地址(比如http://www.asp.net),也可以采用相對地址(比如~/account/register)。

   1: public class RedirectResult : ActionResult
2: {
3: public RedirectResult(string url);
4: public RedirectResult(string url, bool permanent);
5: public override void ExecuteResult(ControllerContext context);
6:
7: public bool Permanent { get; }
8: public string Url { get; }
9: }

暫時重定向和永久重定向可以分別通過調用HttpResponse的Redirect和RedirectPermanent來實現,實際上RedirectResult基於重定向的實現就是通過調用這兩個方法來完成的,這可以通過如下所示的ExecuteResult方法的定義看出來。

   1: public class RedirectResult : ActionResult
2: {
3: //其他成員
4: public override void ExecuteResult(ControllerContext context)
5: {
6: //其他操作
7: string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);
8: if (this.Permanent)
9: {
10: bool endResponse = false;
11: context.HttpContext.Response.RedirectPermanent(url, false);
12: }
13: else
14: {
15: bool flag2 = false;
16: context.HttpContext.Response.Redirect(url, false);
17: }
18: }
19: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved