ASP.NET MVC Controller 和 Action

26 September 2011 — Written by Sky Chang
#ASP.NET MVC

當使用者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代碼。
Sky & Study4.TW