這篇教程探討ASP.NET MVC控制器,控制器action和action result。完成此教程後,你會懂得控制器如何被用來控制訪問者與ASP.NET MVC網站的互動方式。
理解控制器
MVC 控制器負責對ASP.NET MVC網站的請求作出回應。每一個瀏覽器請求都被映射到一個特定的控制器。例如,想象你在瀏覽器地址欄輸入以下URL:
http://localhost/Product/Index/3
在這種情況下,名為ProductController的控制器被調用。 ProductController 負責產生對瀏覽器請求的作出響應。例如,控制器會返回一個特定視圖到瀏覽器或者將使用者重新導向到另一個控制器。
代碼1 包含了一個名為 ProductController 的簡單控制器。
代碼1– Controllers/ProductController.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;namespace MvcApplication1.Controllers{ public class ProductController : Controller { // // GET: /Products/ public ActionResult Index() { // Add action logic here return View(); } }}
就如你在代碼1中看到的,控制器只是一個類(一個Visual Basic .NET或者C#類)。控制器繼承基類 System.Web.Mvc.Controller 。 由於控制器繼承此基類,所以它繼承了幾個有用的方法(等會兒我們來討論這些方法)。
理解控制器 Actions
控制器暴露 actions. 一個 action 是一個控制器上的方法,在瀏覽器地址欄輸入特定URL時就會被調用。例如,想象發送以下URL請求:
http://localhost/Product/Index/3
在這情況下,ProductController 類上的 Index() 方法被調用。 Index() 方法就是控制器action的一個例子。
控制器 action 必須是控制器類的公用方法。C#方法預設是私人方法。注意任何加到控制器類的公用方法都會自動被暴露成控制器action(你必須小心,因為任何人只要在瀏覽器地址欄輸入正確URL都可以調用控制器action)。
滿足控制器action還需要幾個其他需求。用作控制器action的方法不能重載。還有,控制器action 不能是靜態方法。其它的方法都可以作為控制器action。
理解 Action Result
控制器 action 返回某些被稱為 action result 的東西。 action result 就是控制器action對瀏覽器請求作出的響應。
ASP.NET MVC 架構支援集中類型的action result,包括:
- ViewResult – 表示 HTML 和標籤。
- EmptyResult –表示無結果。
- RedirectResult – 表示重新導向到另一個URL
- JsonResult – 表示可用於AJAX程式的 JavaScript對象符號(JSON)。
- ContentResult – 表示文本結果。
- FileContentResult – 表示可下載檔案(二進位內容)。
- FilePathResult – 表示可下載檔案 (路徑)。
- FileStreamResult – 表示可下載檔案(檔案流)。
所有這些 action results 都繼承於 ActionResult 基類。
在多數情況下,控制器 action 返回一個 ViewResult。如代碼2:
代碼2 – Controllers/BookController.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;namespace MvcApplication1.Controllers{ public class BookController : Controller { public ActionResult Index() { // Add action logic here return View(); } }}
當 action 返回一個 ViewResult 時, HTML 返回到瀏覽器。代碼2中的 Index() 方法返回一個名為Index的視圖到瀏覽器。
注意代碼2中的 Index() action 不返回ViewResult(),而是調用了控制器基類的View()方法。通常,不會直接返回action result,而是調用如下控制器基類方法的其中一個:
- View – 返回一個 ViewResult action result.
- Redirect – 返回一個 RedirectResult action result.
- RedirectToAction – 返回一個 RedirectToAction action result.
- RedirectToRoute – 返回一個 RedirectToRouteResult action result.
- Json – 返回一個 JsonResult action result.
- JavaScriptResult –返回一個 JavaScriptResult.
- Content – 返回一個 ContentResult action result.
- File – 返回一個 FileContentResult, FilePathResult, 或者 FileStreamResult ,取決於傳入方法的參數。
所以,如果你想返回一個視圖到瀏覽器,就調用View()方法。如果想將使用者從一個控制器action重新導向到另一個,就調用RedirectToAction()方法。例如,代碼3中的 Details() action 顯示一個視圖或者將使用者重新導向到Index() action,取決於Id參數是否有值。
代碼3 – CustomerController.cs
using System.Web.Mvc;namespace MvcApplication1.Controllers{ public class CustomerController : Controller { public ActionResult Details(int? id) { if (!id.HasValue) return RedirectToAction("Index"); return View(); } public ActionResult Index() { return View(); } }}
ContentResult action result 比較特殊。你可以用 ContentResult action result 來返回一個純文字的 action result 。例如,代碼4中的 Index() 方法返回純文字而非HTML。
代碼4 – Controllers/StatusController.cs
using System.Web.Mvc;namespace MvcApplication1.Controllers{ public class StatusController : Controller { public ActionResult Index() { return Content("Hello World!"); } }}
當 StatusController.Index() action 被調用時, 並不是返回一個視圖,而是返回純文字"Hello World!"到瀏覽器。
如果控制器 action 返回一個不是 action result 的結果 – 例如, 一個日期或者一個整數 – 那麼結果會被自動封裝到 ContentResult 。 例如,當代碼5中的WorkController的 Index() action 被調用,日期會自動作為 ContentResult 返回。
代碼 5 – WorkController.cs
using System;using System.Web.Mvc;namespace MvcApplication1.Controllers{ public class WorkController : Controller { public DateTime Index() { return DateTime.Now; } }}
代碼5中的 Index() action返回一個DateTime對象。 ASP.NET MVC 架構將DateTime對象轉換成字串並將DateTime的值自動封裝到 ContentResult 中。瀏覽器收到的是純文字形式的日期和時間。
總結
本教程的目的是向你介紹ASP.NET MVC控制器,控制器action和控制器 action result的概念。在第一節,你學到了如何添加一個新控制器到ASP.NET MVC程式。然後,你學到了控制器的公用方法如何被暴露為控制器action。最後,我們討論了可以從控制器action 返回的action result的不同類型。特別是,我們討論了如何從控制器action中返回一個 ViewResult, RedirectToActionResult, 和 ContentResult 。
原文地址:http://www.asp.net/learn/mvc/tutorial-03-cs.aspx