ASP.NET MVC Controller 和 Action
當使用者Keyin網址後,瀏覽器送出請求,而透過Routing機制後,緊接著的就是Controller,就如前面MVC架構所敘說的,Controller控制著所有的流程 ( 不然他怎麼會叫做Controller!? ),取得Model、決定View,這些工作都是在Controller裡面進行,我們先看一下簡單的Controller吧。
假設網址是 blog.sanc.idv.tw/home/index
( 這個網址沒有打錯喔,還記得前面講的嗎,MVC的網址和以前我們熟悉的index.html這種檔案式的架構不同,所有的網址要求,會透過Routing重新轉送。 )
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcWebRole1.Controllers { //HomeController代表著blog.sanc.idv.tw/Home <--這個路徑 public class HomeController : Controller { //這個Function代表著blog.sanc.idv.tw/Home/Index <--這個路徑 public ActionResult Index() { return View(); } public ActionResult About() { return View(); } public ActionResult Contact() { return View(); } } }
所以,blog.sanc.idv.tw/Home對應到的是一個類別,也就是HomeController這個類別,而blog.sanc.idv.tw/Home/Index對應到的是HomeController這個類別的Index這個方法,裡面我們還可以看到About、Contact,其實也分別會對應到blog.sanc.idv.tw/Home/About和blog.sanc.idv.tw/Contact這兩個路徑。
所以我們可以知道,當瀏覽器請求進來的時候,就會到對應的Controller裡面,對應的Function來做指定的事情,而這個Function在MVC裡面,我們又稱為Action,( 所以未來我會用Action來稱呼 )。
到這邊,我們算是複習複習之前講的,接下來我們在繼續往下看看Controller和Action。
ActionResult
我們將Controller的其中一個Action拉出來看一下。
public ActionResult Index() { return View(); }
我們可以看到,這個Action的回傳值是一個ActionResult型別,其實這是一個抽象型別,最後一行的return View();,其實會回傳一個ViewResult型別,而這個型別就是繼承於ActionResult型別,最後,Controller就會利用取得的這個ActionResult裡面的ExecuteResult方法,將畫面 ( 或是其他結果 )傳回使用者端。
既然ActionResult是抽象型別,也就表示會有很多的類別繼承於他,接下來,我們會開始介紹型別。
ASP.NET MVC 3 可用的ActionResult的型別
下面是可用的型別列表,後續會一個一個寫上範例,Controller Helper Methods代表的是可以讓我們快速地去使用,例如return View();的View(),他就會產生一個ViewResult型別出來。
型別 | 簡介 | Controller Helper Methods |
---|---|---|
EmptyResult | 甚麼事都不做… | 無 |
ContentResult | 回傳文字至瀏覽器,可以自行設定content-type。 | Content |
FileResult | 回傳二位元資料,例如Server上的mp3等檔案。 | File |
ViewResult | 呈現指定或是預設的View。 | View |
PartialViewResult | 呈現指定或是預設的View樣板 | PartialView |
RedirectToRouteResult | 如果產生HTTP 301、302則會重新導向到另外一個Action或是其他指定的URL、或是設定好的Router。 |
RedirectToAction RedirectToActionPermanent RedirectToRoute RedirectToRoutePermanent |
RedirectResult | 如果產生HTTP 301、302則會導向至另外一個URL。 | Redirect RedirectPermanent |
JsonResult | 將.net 物件序列化成Json格式並回傳。 | Json |
JavaScriptResult | 回傳一個JavaScript的程式碼片段,通常用於Ajax裡面。 | JavaScript |
HttpUnauthorizedResult | 回傳HTTP 401 ( 未授權 )。 | None |
HttpNotFoundResult | 回傳HTTP 404。 | HttpNotFound |
HttpStatusCodeResult | 返回指定的HTTP代碼。 | 無 |