MVC 3 我們一起來 掌握 ActionResult之多個小弟


我在上一篇博客不要停留在表面,MVC 3 我們要深入一些 說明了我們的掌握程度還是不夠,還需要我們繼續努力。但是有園友質疑說他們認為我說的只是書院派,並不實用,這令作為程序員的我很是生氣。好吧,那咱們就一起來學習一下其中的一個知識點:ActionResult吧。希望你不是大牛,沒有完全的掌握。

ActionResult 是MVC中Action 執行之后返回的結果,我們可以通過ResultFilter 來橫向的操作這些返回數據。可以說在MVC中,只要返回值不是void,或者可以這么說吧,每個Action的返回值都是ActionResult。你可能有些不服氣,我怎么知道這些,怎么確定這些是正確的不是誤導大家。下面我們來一個一個的看一下ActionResult的小弟們。

上圖表示的是ActionResult的家譜圖,這些說明了我們可以使用的返回值類型。

現在我們分返回值不同來討論一下 不同的返回值

ActionResult的執行是通過ExecuteResult(ControllerContext context)來執行。不同的子類最后 會覆蓋這個方法來實現自己的業務。

 

1 namespace System.Web.Mvc {
2 
3     public abstract class ActionResult {
4 
5         public abstract void ExecuteResult(ControllerContext context);
6 
7     }
8 
9 }

借鑒Artech的那篇了解ASP.NET MVC幾種ActionResult的本質:EmptyResult & ContentResult 我們可以得到action的返回值為null或者void,最后會生成EmptyResult 類型的實例。而如果返回的是普通的數據類型,例如double,string等 都會生成ContentResult 類型的實例,如果為具體的ActionResult或者子類,那么就會返回對應的ActionResult。 看到這兒可能你會有點疑惑,其實這是我在這篇博客中突出要說明的問題。就是Action的返回值問題。可以說Action的返回類型就是ActionResult的實例。

 1     public class TestController : Controller
 2     {
 3         //
 4         // GET: /Test/
 5 
 6         public ActionResult Index()
 7         {
 8             return View(); //返回類型為ViewResult類型
 9         }
10 
11         public ActionResult GetPartial()
12         {
13             return PartialView();//返回PartialViewResult類型    PartialViewResult 和ViewResult 有一個共同父類ViewResultBase
14         }
15         public void NoReturn()
16         { 
17         //雖然說沒有返回值,但是在MVC中 確實會生成一個什么都不執行的EmptyResult類型
18         }
19 
20         public ActionResult GetNull()
21         {
22             return null;//生成EmptyResult類型實例  其實我們這么想,只要返回值為空 就是EmptyResult
23         }
24 
25         public ContentResult GetContent()
26         {
27             return Content("hello");//返回值類型為ContentResult
28         }
29 
30         public JavaScriptResult GetJs()
31         {
32             return JavaScript("alert('dsdsds')");//返回值類型為Javascript 可能有時候我們直接調用這個方法 在ie中會提示下載,這是因為沒有引入對應的jquery庫的原因
33         }
34 
35         public JsonResult GetJson()
36         {
37             return Json("{userName:'yuan',password:'yuan'}"); //返回值類型為jsonResult  在這里再啰嗦一句,其實返回值就已經是json,在我們通過ajax調用的時候,不需要eval解析了
38         }
39 
40         public FileResult GetStream()
41         {
42             return File(System.Text.Encoding.UTF8.GetBytes("hello"), "text/plain"); //返回值為FileContentResult  在File方法中,第三個參數為一個downLoadName值,如果設置了,則會下載文件,如果
43                                                                                       //不設置 ,就是在瀏覽器中打開 FileContentResult  FileStreamResult FilePathResult 都是如此
44         }
45 
46         public HttpStatusCodeResult NotFound()
47         {
48             return HttpNotFound();//返回值是HttpNotFoundResult 表示的未找到文件 這是在MVC 3中新添加的HttpStatusCodeResult
49         }
50 
51         public RedirectResult NotPer()
52         {
53             return Redirect("http://www.asp.net");//重定向 這個為臨時重定向 狀態碼是302
54         }
55         public RedirectResult Per()
56         {
57             return RedirectPermanent("http://www.asp.net"); //永久重定向 狀態嗎是301
58         }
59 
60     }

我上面列舉出了一些 常用Action的返回值類型。最重要的我還是要說可以說所有Action的返回值都是ActionResult。

還有Action如何執行?ActionResult如何調用ExecuteResult 方法的?ViewResult的渲染?這些內容等在以后咱們慢慢敘述。但是還是那句話,只有掌握了這些,才可以靈活的運用,在基礎上我們多花些時間,將來我們可能省去很多查資料的時間。

馬上公司要下班了,我也不寫太多了,我再最后說明一下,

雖然說每個ActionResult 的子類都是單獨的存在,但是她們之間還是有一定的聯系的,比如ContentResult就可以和JsonResult進行互換使用,所以說還需要繼續努力。

ActionResult 在表面上可以看到的內容並不多,但是有時候還是會遇到一些問題。

返回值為JsonResult的類型本身就是json數據,不需要進行解析。

返回值為JavascriptResult的js語句,一定要記得在頁面中添加引用js。

FileResult的三個子類,可以用來對文件進行操作,其中FilePathResult是通過 response.TransmitFile(FileName); 來實現的,在內存中沒有緩存,可以輸出大文件,沒有斷點續傳功能。

FileStreamResult是通過文件流來進行文件下載的,Stream outputStream = response.OutputStream;    outputStream.Write(buffer, 0, bytesRead); 是通過response.outputStream輸出的。

FileContentResult  是通過二進制來輸出文件的。還有就是如果在File方法的第三個參數中填寫了下載名稱,那么就相當於下載,而不會在瀏覽器中顯示。

下班了,收筆

 

 

 

 


免責聲明!

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



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