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的實例,而是使用了一個匿名的對象初始化來僅傳遞那些需要的數據,如下面的代碼樣本所示:
- public ActionResult PartialJson()
- {
- var category = new ProductCategory { Name="Partial"};
- var result = new { Name = category.Name
- , ProductCount = category.Products.Count };
- return Json(result);
- }}
注意:
該方法沒有直接實例化JsonResult,而是使用了Json輔助方法。本章后面將進一步討論輔助方法。
在該樣本中,所有需要的是類別名稱以及該類別對應的產品計數。因此,沒有串行化整個對象圖表,而是取出來自實際對象的需要的信息,並將該信息存儲在一個名為result的匿名類型實例中。然后,將該實例發送給響應,而不是整個對象圖表。
5. JavaScriptResult
JavaScriptResult用來在客戶機上執行來自服務器的JavaScript。例如,在使用內置的Ajax輔助方法發送對動作方法的請求時,方法可能只是返回一些JavaScript,它將在到達客戶機時立刻執行:
- public ActionResult DoSomething() {
- script s = "$('#some-div').html('Updated!');";
- return JavaScript(s);
- }
這將通過如下的代碼來調用:
- <%= Ajax.ActionLink("click", "DoSomething", new AjaxOptions()) %>
- <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