asp.net mvc Controller控制器返回類型


ASP.NET MVC包括了執行常見任務的ActionResult類型。這些類型羅列在表5-1中。每個類型都將在隨后的小節中詳細討論。

表5-1  動作結果的類型及其說明

動作結果的類型

    

EmptyResult

代表一個空值或空的響應。不進行任何操作

ContentResult

將指定的內容作為文本直接寫入響應中

JsonResult

串行化提供到JSON中的對象並將

JSON寫入響應中

RedirectResult

將用戶重新定向到給定的URL中

RedirectToRouteResult

將用戶重新定向到通過路由選

擇參數指定的URL中

ViewResult

調用進視圖引擎以將視圖呈現到響應中

PartialViewResult

與ViewResult相似,除了沒有將局部

視圖呈現給響應之外,通常會響應AJAX請求

FileResult

用作一組結果的基類,這組結果將二

進制的響應編寫到流中。這對於將文

件返回給用戶非常有用

FilePathResult

繼承自FileResult並返回,將文件寫入

基於文件路徑的響應中

FileContentResult

繼承自FileResult並返回,將一個字

節數組寫入響應中

FileStreamResult

繼承自FileResult並返回,將一個

流寫入響應中

JavaScriptResult

用於在客戶機上立刻執行來自服務

器的JavaScript代碼


1. EmptyResult

顧名思義,這一結果用來指明架構不做任何事情。這遵循的是常見的設計模式,稱作Null Object模式,它將通過一個實例替換空的引用。在該實例中,ExecuteResult方法具有一個空的實現。該設計模式在Martin Fowler的重構書中詳細介紹過。更多內容參見http://martinfowler.com/bliki/refactoring.html

2. ContentResult

這一結果將其指定的內容(通過Content屬性)寫入響應中。此外,這個類還支持指定內容的編碼(通過ContentEncoding屬性)以及內容類型(通過ContentType屬性)。

如果沒有指定編碼,那么就使用對當前HttpResponse實例的內容編碼。HttpResponse的默認編碼是在web.config的全局化元素中指定的。

同樣,如果沒有指定內容類型,則使用當前HttpResponse實例上的內容類型設置。HttpResponse默認的內容類型是"text/html"。

3. FileResult

除了用於將二進制內容(例如,磁盤上的Microsoft Word文檔或來自SQL Server中blob列的數據)寫入響應中之外,該結果非常類似於ContentResult。設置結果上的FileDownloadName屬性將設置Content-Disposition題頭的適當值,這導致一個文件下載對話框出現在用戶面前。

注意,FileResult是一個抽象基類,用於如下3個不同的文件結果類型:

FilePathResult

FileContentResult

FileStreamResult

使用方法通常遵循的是"工廠模式(factory pattern)",在該模式中,返回的具體類型取決於調用了哪一個File方法(將在隨后討論)的重載。

4. JsonResult

該結果使用JavaScriptSerializer類來將其內容(通過Data屬性指定)串行化為JSON(JavaScript Object Notation)格式。對於簡單的Ajax情形,如果需要一個動作方法來以一種易於為JavaScript消費的格式返回數據,那么這一結果將非常有用。

與ContentResult一樣,JsonResult的內容編碼和內容類型可以通過屬性來設置。唯一的區別在於默認的ContentType是"application/json",而不是該結果對應的"text/html"。

注意,JsonResult串行化整個對象圖表。因此,如果提供一個ProductCategory對象(含有一個20個Product實例的集合),那么還將串行化每個Product實例並將其包含到發送給響應的JSON中。現在,假設每個Product都含有一個包含了20個Order實例的Orders集合,那么可以想象,JSON響應可能迅速膨脹。

目前,尚沒有方法來限制串行化成JSON的數量,這樣對於含有大量屬性和集合的對象(如通常由LINQ To SQL生成的對象)而言,可能就會出現問題。推薦的方法是創建一個含有具體信息的類型,這些信息就是想要包含到JsonResult中的信息。這一情形正是匿名類型派上用場的地方。

例如,在前面的情形中,沒有串行化ProductCategory的實例,而是使用了一個匿名的對象初始化來僅傳遞那些需要的數據,如下面的代碼樣本所示:

  1. public ActionResult PartialJson()   
  2. {  
  3.     var category = new ProductCategory { Name="Partial"};  
  4.     var result = new { Name = category.Name  
  5.       , ProductCount = category.Products.Count };  
  6.     return Json(result);  
  7. }} 

注意:

該方法沒有直接實例化JsonResult,而是使用了Json輔助方法。本章后面將進一步討論輔助方法。

在該樣本中,所有需要的是類別名稱以及該類別對應的產品計數。因此,沒有串行化整個對象圖表,而是取出來自實際對象的需要的信息,並將該信息存儲在一個名為result的匿名類型實例中。然后,將該實例發送給響應,而不是整個對象圖表。

5. JavaScriptResult

JavaScriptResult用來在客戶機上執行來自服務器的JavaScript。例如,在使用內置的Ajax輔助方法發送對動作方法的請求時,方法可能只是返回一些JavaScript,它將在到達客戶機時立刻執行:

  1. public ActionResult DoSomething() {  
  2.     script s = "$('#some-div').html('Updated!');";  
  3.  
  4.     return JavaScript(s);  

這將通過如下的代碼來調用:

  1. <%= Ajax.ActionLink("click", "DoSomething", new AjaxOptions()) %> 
  2.  <div id="some-div"></div> 

這里假設引用了AJAX庫和jQuery。

6. RedirectResult

該結果將執行重新指向指定URL的HTTP(通過Url屬性設置)。從內部講,該結果調用HttpResponse.Redirect方法,這將HTTP狀態碼設置為HTTP/1.1 302 Object Moved,導致瀏覽器立刻發送一個對指定URL的新請求。

從技術的角度講,只要直接調用動作方法中的Response.Redirect,但是使用RedirectResult將該動作推遲到動作方法完成其工作之后。這在對動作方法進行單元測試時非常有用,而且幫助保持底層的架構細節位於動作方法外部。

7. RedirectToRouteResult

執行HTTP重定向的方式與執行RedirectResult的方式一樣,但是不同的是,沒有直接指定一個URL,這一結果使用路由選擇的API來確定重定向的URL。

注意,目前有兩種方便的方法(如下面定義的),RedirectToRoute和RedirectToAction,這兩個方法將返回該類型的結果。

8. ViewResult

該結果是最廣為使用的動作結果類型。它調用IViewEngine實例的FindView方法,返回IView的一個實例。隨后,ViewResult調用IView實例上的Render方法,它將呈現響應的輸出。一般來說,這將把指定的視圖數據(即動作方法准備顯示在視圖中的數據)融入到一個模板中(該模板將對被顯示的數據進行格式化)。

第6章將更詳細地討論視圖的問題。

9. PartialViewResult

除了調用FindPartialView方法(而不是FindView)來定位視圖之外,該結果的工作方式與ViewResult的工作方式完全相同。它用來呈現局部視圖(如ViewUserControl),而且在局部更新的時候(即使用AJAX通過大塊HTML更新頁面部分時),它很有用。

 

 

 

 

轉載:

 

原文地址:http://book.51cto.com/art/201006/205372.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM