MVC ActionResult衍生類別關係圖

來源:互聯網
上載者:User

標籤:分享   參數   argument   partial   net   tostring   cannot   支援   rda   

態度決定一切,我要改變的不僅僅是技術,還有對待事情的態度!

先上個圖:

由可知,ActionResult為根節點,其下有很多子節點!下面簡單介紹下:

MVC中ActionResult是Action的返回結果。ActionResult 有多個衍生類別,每個子類功能均不同,並不是所有的子類都需要返回視圖View,有些直接返迴流,有些返回字串等。ActionResult是一個抽象類別,它定義了唯一的ExecuteResult方法,參數為一個ControllerContext,下面為您介紹MVC中的ActionResult 的用法!

ActionResult是控制器方法執行後返回的結果類型,控制器方法可以返回一個直接或間接從ActionResult抽象類別繼承的類型,如果返回的是非ActionResult類型,控制器將會將結果轉換為一個ContentResult類型。預設的ControllerActionInvoker調用ActionResult.ExecuteResult方法產生應的結果。

常見的幾種ActionResult

 

1、ContentResult

返回簡單的純文字內容,可通過ContentType屬性指定應答文件類型,通過ContentEncoding屬性指定應答文檔的字元編碼。可通過Controller類中的Content方法便捷地返回ContentResult對象。如果控制器方法返回非ActionResult對象,MVC將簡單地以返回對象的ToString()內容為基礎產生一個ContentResult對象。

C# 代碼   複製
public ContentResult RSSFeed() 
{     Story[] stories = GetAllStories(); // Fetch them from the database or wherever       // Build the RSS feed document     string encoding = Response.ContentEncoding.WebName;     XDocument rss = new XDocument(new XDeclaration("1.0", encoding, "yes"),         new XElement("rss", new XAttribute("version", "2.0"),             new XElement("channel", new XElement("title", "Example RSS 2.0 feed"),                 from story in stories                 select new XElement("item",                       new XElement("title", story.Title),                       new XElement("description", story.Description),                       new XElement("link", story.Url)                    )             )         )     );      return Content(rss.ToString(), "application/rss+xml"); }


2、EmptyResult

返回一個空的結果。如果控制器方法返回一個null,MVC將其轉換成EmptyResult對象。


3、RedirectResult

表示一個串連跳轉,相當於ASP.NET中的Response.Redirect方法。對應的Controller方法為Redirect。

 C# 代碼   複製
public override void ExecuteResult(ControllerContext context) {    if (context == null) {        throw new ArgumentNullException("context");    }    if (context.IsChildAction) {        throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);    }     string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);    context.Controller.TempData.Keep();    context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */);}


4、RedirectToRouteResult

同樣表示一個調轉,MVC會根據我們指定的路由名稱或路由資訊(RouteValueDictionary)來產生Url地址,然後調用Response.Redirect跳轉。對應的Controller方法為RedirectToAction和RedirectToRoute。


5、ViewResult:

表示一個視圖結果,它根據視圖模板產生應答內容。對應Controller方法為View。


6、PartialViewResult:

表示一個部分視圖結果,與ViewResult本質上一致,只是部分視圖不支援母片,對應於ASP.NET,ViewResult相當於一個Page,而PartialViewResult則相當於一個UserControl。它對應的Controller方法為PartialView。


7、HttpUnauthorizedResult:

表示一個未經授權訪問的錯誤。MVC會向用戶端發送一個401的應答狀態。如果在web.config中開啟了表單驗證(authentication mode="Forms"),則401狀態會將Url轉向指定的loginUrl連結。


8、JavaScriptResult:

本質上是一個常值內容,只是將Response.ContentType設定為 application/x-javascript,此結果應該和MicrosoftMvcAjax.js指令碼配合使用,用戶端接收到Ajax應答後,將判斷Response.ContentType的值,如果是application/x-javascript,則直接eval執行返回的應答內容。此結果類型對應的Controller方法為JavaScript。


9、JsonResult:

表示一個JSON結果。MVC將Response.ContentType設定為application/json,並通過JavaScriptSerializer類將指定對象序列化為Json表示方式。需要注意,預設情況下,MVC不允許GET請求返回JSON結果,要解除此限制,在產生JsonResult對象時,將其JsonRequestBehavior屬性設定為JsonRequestBehavior.AllowGet。此結果對應的Controller方法為Json。

C# 代碼   複製
class CityData { public string city; public int temperature; } public JsonResult WeatherData() {     var citiesArray = new[] {         new CityData { city = "London", temperature = 68 },         new CityData { city = "Hong Kong", temperature = 84 }     };     return Json(citiesArray); }


10、FilePathResult、FileContentResult、FileStreamResult: 這三個類繼承於FileResult,表示一個檔案內容,三者的區別在於,FilePath通過路徑傳送檔案到用戶端,FileContent通過位元據的方式,而FileStream是通過Stream的方式來傳送。Controller為這三個檔案結果類型提供了一個名為File的重載方法。

 

FilePathResult:直接將一個檔案發送給用戶端

 C# 代碼   複製
public FilePathResult DownloadReport() 
{     string filename = @"c:\\files\\somefile。pdf";     return File(filename, "application/pdf", "AnnualReport。pdf"); }

 

FileContentResult:返回byte位元組給用戶端比片

 C# 代碼   複製
public FileContentResult GetImage(int productId) 
{     var product = productsRepository.Products.First(x => x.ProductID == productId);     return File(product.ImageData, product.ImageMimeType); }<img src="<%: Url.Action("GetImage", "Products",  new { Model.ProductID }) %>" /> 

 

FileStreamResult:返迴流

 C# 代碼   複製
public FileStreamResult ProxyExampleDotCom() 
{     WebClient wc = new WebClient();     Stream stream = wc.OpenRead(http://www.studyofnet.com/);     return File(stream, "text/html"); }

最後作一個總結:

類名 抽象類別 父類 功能
ContentResult     根據內容的類型和編碼,資料內容
EmptyResult     空方法
FileResult abstract   寫入檔案內容,具體的寫入方式在衍生類別中
FileContentResult   FileResult 通過 檔案byte[] 寫入檔案
FilePathResult   FileResult 通過 檔案路徑 寫入檔案
FileStreamResult   FileResult 通過 檔案Stream 寫入檔案
HttpUnauthorizedResult     拋出401錯誤
javaScriptResult     返回Javascript檔案
JsonResult     返回Json格式的資料
RedirectResult     使用Response.Redirect重新導向頁面
RedirectToRouteResult     根據Route規則重新導向頁面
ViewResultBase abstract   調用IView.Render()
PartialViewResult   ViewResultBase 調用父類ViewResultBase 的ExecuteResult方法. 重寫了父類的FindView方法. 尋找使用者控制項.ascx檔案
ViewResult   ViewResultBase 同上


@陳臥龍的部落格

MVC ActionResult衍生類別關係圖

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.