ASP.NET MVC 控制器概觀 (C#)
在此教學課程中,Stephen Walther 會介紹 ASP.NET MVC 控制器。 您將了解如何建立新控制器,並傳回不同類型的動作結果。
此教學課程會探索 ASP.NET MVC 控制器、控制器動作和動作結果的主題。 完成本教學課程後,您會了解如何使用控制器來控制訪客與 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 類別的類別。 因為控制器繼承自這個基底類別,控制器免費繼承數個有用的方法 (我們稍後會討論這些方法)。
了解控制器動作
控制器會公開控制器動作。 動作是指在控制器上呼叫,亦即當您在瀏覽器網址列中輸入特定 URL 時呼叫的方法。 例如,假設您提出下列 URL 要求:
http://localhost/Product/Index/3
在此情況下,ProductController 類別上會呼叫 Index() 方法。 Index() 方法是控制器動作的範例。
控制器動作必須是控制器類別的公用方法。 C# 方法預設為私用方法。 請注意,您新增至控制器類別的任何公用方法,都會自動公開為控制器動作 (您必須小心,因為領域中的任何人只要在瀏覽器網址列中輸入正確的 URL,都可以叫用控制器動作)。
控制器動作必須滿足一些額外的需求。 做為控制器動作的方法不可超載。 此外,控制器動作不得為靜態方法。 除此之外,您可以使用任何方法做為控制器動作。
了解動作結果
控制器動作會傳回稱為動作結果的內容。 動作結果是控制器動作傳回以回應瀏覽器要求的內容。
ASP.NET MVC 架構支援幾種類型的動作結果,包括:
- ViewResult - 代表 HTML 和標記。
- EmptyResult - 代表無結果。
- RedirectResult - 代表重新導向至新的 URL。
- JsonResult - 代表可在 AJAX 應用程式中使用的 JavaScript 物件表示法結果。
- JavaScriptResult - 代表 JavaScript 指令碼。
- ContentResult - 代表文字結果。
- FileContentResult - 代表可下載的檔案 (包含二進位內容)。
- FilePathResult - 代表可下載的檔案 (路徑)。
- FileStreamResult - 代表可下載的檔案 (含檔案串流)。
所有這些動作結果都繼承自基底 ActionResult 類別。
在大部分情況下,控制器動作會傳回 ViewResult。 例如,清單 2 的索引控制器動作會傳回 ViewResult。
清單 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();
}
}
}
當動作傳回 ViewResult 時,HTML 會返回至瀏覽器。 清單 2 的 Index() 方法,會將名為 Index 的檢視傳回瀏覽器。
請注意,清單 2 的 Index() 動作不會傳回 ViewResult()。 反而會呼叫 Controller 基底類別的 View() 方法。 一般而言,您不直接傳回動作結果。 反而會呼叫 Controller 基底類別的下列其中一種方法:
- 檢視 - 傳回 ViewResult 動作結果。
- 重新導向 - 傳回 RedirectResult 動作結果。
- RedirectToAction - 傳回 RedirectToRouteResult 動作結果。
- RedirectToRoute - 傳回 RedirectToRouteResult 動作結果。
- Json - 傳回 JsonResult 動作結果。
- JavaScriptResult - 傳回 JavaScriptResult。
- Content - 傳回 ContentResult 動作結果。
- File - 根據傳遞至方法的參數,傳回 FileContentResult、FilePathResult 或 FileStreamResult。
因此,如果您想要將 View 傳回瀏覽器,您會呼叫 View() 方法。 如果您想要將使用者從一個控制器動作重新導向到另一個控制器動作,請呼叫 RedirectToAction() 方法。 例如,清單 3 中的 DDetails() 動作會顯示檢視,或根據 Id 參數是否有值,將使用者重新導向至 Index() 動作。
清單 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 動作結果很特別。 您可以使用 ContentResult 動作結果,以純文字形式傳回動作結果。 例如,清單 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() 動作時,不傳回檢視。 相反的,原始文字 “Hello World!” 會返回至瀏覽器。
如果控制器動作傳回的結果不是動作結果 (例如日期或整數),則結果會自動包裝在 ContentResult 中。 例如,當叫用清單 5 中 WorkController 的 Index() 動作時,會自動將日期當做 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() 動作會傳回 DateTime 物件。 ASP.NET MVC 架構會將 DateTime 物件轉換成字串,並自動將 DateTime 值包裝在 ContentResult 中。 瀏覽器會接收純文字格式的日期和時間。
摘要
本教學課程的目的是介紹 ASP.NET MVC 控制器的概念、控制器動作和控制器動作結果。 在第一節中,您已了解如何將新控制器新增至 ASP.NET MVC 專案。 接著,您了解控制器的公用方法如何公開相關領域,以做為控制器動作。 最後,我們討論了可以從控制器動作傳回的不同動作類型結果。 我們還特別探討如何從控制器動作傳回 ViewResult、RedirectToActionResult 和 ContentResult。