請注明轉載地址:http://www.cnblogs.com/arhat
上一章,我們闡述了Controller,Action和ActionResult所代表的含義及使用,本章繼續研究ActionResult。因為ActionResult是Action的返回值,所代表的意義就是Action執行后的結果,比較重要,所以本章重點將介紹ActionResult和他的子類。
由於上一章我們講了ActionResult的一個子類ViewResult,我們知道了ViewResult就是代表視圖的意思,根據Action的返回值決定調用那個View。我們從幫助文檔上看,可以知道ActionResult的子類有下面幾種。
| ViewResult | 表示HTML的頁面內容 |
| EmptyResult | 表示空白的頁面內容 |
| RedirectResult | 表示定位到另外一個URL |
| JsonResult | 表示可以運用到AJAX程序中JSON結果 |
| JavaScriptResult | 表示一個JavaScript對象 |
| ContentResult | 表示一個文本內容 |
| FileContentResult | 表示一個可以下載的、二進制內容的文件 |
| FilePathResult | 表示一個可以下載的、指定路徑的文件 |
| FileStreamResult | 表示一個可以下載的、流式的文件 |
大家可以看到Action的子類常用的有9個,分別代表了不同的含義,根據具體的情況使用具體的子類。由於子類比較多,本章將講解EmptyResult,RedirectResult,ContentResult這三種。剩余的幾種類型我們在后面的章節繼續講解。
一、EmptyResult表示空白的頁面內容
顧名思義,Emty是空白的意思,也就是說這個結果代表了一個空的頁面內容。我們先看一下EmptyResult的執行效果,然后分析他的更能!打開我們的項目“Com.ArHat.Web”。更改一下HomeController的Index方法。
public ActionResult Index() { return new EmptyResult(); }
既然是EmptyResult,那么就不需要有一個視圖文件和Index方法名對應。然后我們預覽一下效果: 
大家可以看到瀏覽器顯示的空的頁面,同時我們查看一下源代碼,發現也是空的。那么Empty既然是空的,那么有什么用呢?這個EmptyResult可以說起到一個中轉的作用,起到適配器的作用,如果我們有些請求只是要求統計一下數量並不需要顯示頁面,則這個Empty就起到了作用。
二、RedirectResult表示定位到另外一個URL
看到這個名字后,我們從名字翻譯過來就是重新定位到一個結果,很顯然就是提到了一個跳轉的作用,主要作用就是要跳轉到其他的網址。我們更改一下HomeController的代碼,我們添加一個About的方法。然后給About方法添加一個視圖文件About.cshtml文件,然后更改Index方法,讓我們瀏覽器預覽Index方法時候,直接跳轉到About動作上。
public class HomeController : Controller { public ActionResult Index() { //當然也可以跳轉到其他的網站上,這個是必須的 //return Redirect("http://www.cnblogs.com/arhat"); return Redirect("/Home/About"); } public ActionResult About() { return View(); } }
預覽結果如圖:
大家可以看到,我們預覽的是Index,但是由於Index中使用了Redirect()方法,返回的是RedirecResult,所以跳轉到了About了。那么在Controller中,提供了Redirect()方法是專門針對RedirectAction的。我們來看一下這個方法的定義。
protected internal virtual RedirectResult Redirect(string url);
參數url就是要重定向到的url地址。這個方法的作用就是Response.Redirect。
ContentResult表示一個文本內容
同樣的,從名字上我們看到這個是文本內容的結果,這個就有點意思了,為什么呢?大家注意了這里的Content指的是“文本”,還記得老魏曾經給大家見過的”文本”的含義嗎?就是原格式。不會被解析的內容,但是這里的“文本”的含義包含了html,如果是html內容,那么輸出的結果會被解析,但是需要注意的是對於javascript腳本也會被執行。那么這個ContentResult就是這個效果,同樣的,在使用ContentResult的時候也不需要對應的View.說白了這個返回值和下面的兩句話可以說是對等的。
Response.Write(“內容”);
Response.End();
我們來看一個例子吧。修改一下Index的代碼:
public ActionResult Index() { //return Content("你好啊ContentResult"); //return Content("<script>alet('你好啊ContentResult')</script>"); return Content("<font color='red'>你好啊ContentResult</font>"); }
那么大家可以運行一下效果,分別取消注釋,大家看看結果是什么!提示一下,注意查看一下運行后的源碼哦!
當然這里也有一點小技巧,如果大家使用Ajax異步請求的話,返回的值是text類型的,那么大家可以使用這個ContentResult哦。希望大家復習一下老魏教你們的AjaxInvoke這個框架,其實ContentResult實現的原理和AjaxInvoke一樣的。
從上面我們看到了,我們使用的是Controller提供的Content方法,我們來看一下這個方法的定義:
protected internal ContentResult Content(string content); protected internal ContentResult Content(string content, string contentType); protected internal virtual ContentResult Content(string content, string contentType, Encoding contentEncoding);
大家可以看到這個方法被重載了3次,作用都是一樣的。第一個我這里就不在講解了。第二個是多一個了參數contentType,用來說明輸入內容的格式。大家可以查看一些MIME類型,但是注意不是所有的MIME類型都被這個方法所支持,僅支持一些表示文本的contentType,比如”text/html”,”text/plain”,”text/xml”等等。
第三個函數,大家可以看出,無非是聲明一下內容的編碼而已了,這個編碼老魏以前給大家經過,尤其是“三碼合一”這個知識。
這三個函數,大家可以根據實際情況選擇一下。好了,本章就到這里吧,下一章,我們繼續其他的ActionResult.

