標籤:分享 參數 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衍生類別關係圖