[MVC] 入門 Controller

自上篇《第一個ASP.Net MVC程式》之後好一段時間都沒有發文了,趁最近比較有空閒的時間再來把一些東西整理整理再分享給各位。

最近ASP.Net MVC 4 也出Developer Preview版本,所以各位可以至ASP.NET MVC 4 Developer Preview下載最新版本來用用看。筆者接下來將以此版本來教學了。這篇將帶領各位來了解Controller。

了解MVC Pattern

MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller)。

  • (模型Model) – 程式設計師編寫程式應有的功能(實作演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實作具體的功能)。
  • (檢視View) – 介面設計人員進行圖形介面(UI)設計,可將Model的資料呈現。
  • (控制器Controller)- 負責轉發請求,對請求進行處理。

Wiki MVC
(以上資料來自Wiki)

了解ASP.Net MVC

ASP.Net MVC Interactions

從這圖我們可以看到,客戶端向伺服器請求網頁的時候,會先到Controller那邊作處理,依據網址和參數,事情況向Model存取資料,之後再將資料傳至View裡然後再回傳網頁給客戶端。所以可以看出來Controller是前哨站,控制所有連進網站然後分配給予什麼樣的網頁。

了解Controller

當我們新增一個MVC的方案的時候,會有一個Controllers資料夾,所有Controller放在這裡。這些類別繼承System.Web.Mvc.Controller。控制器命名名稱都必須以Controller做結尾。我們新增一個HomeController,連結網址就是http://localhost/Home,而Index就是Action,在每一個Controller可以定義許多Action,如下方程式有個名稱命名為Test,連結該網址就是Http://localhost/Home/Test

[csharp]
namespace AsFlexer.WebUI.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/

public String Index()
{
return "This is Home/Index By AsFlexer.com";
}

//
// GET: /Home/Test

public String Test()
{
return "This is Home/Test By AsFlexer.com";
}
}
}[/csharp]

進階一點還可以改網址的形式,但這在之後的文章才會交各位如何去調整自己想要的網址格式,但當然先跟各位透露一下是在哪裡去編輯的。在Global.asax的RegisterRoutes設定,我們可以看到預設Controller是Home,Action是Index,所以沒打的時候會自動帶入這組參數,如果網址只有帶入Controller的話,Action就會預設帶入Index。而我們看到還有一個參數是id,這個是檢視、編輯或者刪除可以把id帶入action裡存取用的。

[csharp]public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index",
id = UrlParameter.Optional } // Parameter defaults
);
}[/csharp]

常見的ViewResult和ActionResult

ViewResult通常是回傳一個View();通常位於相對應的位置或者是Shared下同樣名稱的View,通常沒有特殊需求只是要顯示網頁用這個就可以了。而ActionResult是abstract class,幾乎所有功能他都可以支援,像是轉頁、回傳404、JsonResult、檔案下載等等通常都可以支援,雖然說也有相對應的類別可以使用,但是ActionResult的功能幾乎全包了,當這個Action需要一些特殊的狀況就可以使用ActionResult。

[csharp]public ViewResult DemoViewResult()
{
return View(); // Views/Home/DemoActionResult.cshtml
}

public JsonResult Ajax()
{
return Json(new { Title = "AsFlexer", Url = "http://asflexer.com" });
}

public ActionResult DemoActionResult()
{
return View();
return Redirect("http://asflexer.com"); //轉址到別的網站
return RedirectToAction("DemoActionResult"); //連結轉到另一個Action
return HttpNotFound(); //
}
[/csharp]

設定Action可支援或限制GET或POST方式

MVC很貼心的,可以直接在Action上面直接設定該連結是要用GET或是POST連結。在這裡我們可以看到Action裡都帶有參數,代表可以將參數GET或POST到Action裡面,然後在程式內部直接存取這些數值。參數也可以設定預設值,代表如果連結來沒有這參數的話,就直接帶入預設值。

[csharp highlight="3,9"]
// GET: /Home/GetMyWeb/5
// GET: /Home/GetMyWeb?id=5
[HttpGet]
public ViewResult GetMyWeb(int id, string type = "all")
{
return View(id); //將id傳入View裡 (@Model)
}

[HttpPost]
public ActionResult PostMyData(int id, string Name)
{
// 檢查輸入狀況
if (id != 0 && !String.IsNullOrEmpty(Name))
{
//TODO: 儲存資料或一些運作後轉到其他頁面
return RedirectToAction("Thanks")
}
else
{
return View();
}
}[/csharp]

到這裡大家應該比較清楚Controller的用法了,下一篇我們將解說Controller搭配View來呈現網頁的部分。以及將來再跟各位介紹Filters部分,可針對角色控管等認證功能和一些特殊屬性。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>