前言
前一篇介紹了MVCMusicStore的開篇介紹,還有人捧場,非常Happy,所以,今天繼續。
概述
第二篇要講的是控制器,先看看源文章對控制器的簡述:首先是說URL,傳統web框架都是URL對應物理文件(當然這里是排除URL重寫技術),比如“/Products.aspx”或者"/Products.php"肯定對應網站目錄下的“/Products.aspx”或者"/Products.php"文件。
但是,基於WEB的MVC框架把RequestUrl 映射到服務端代碼的方式不同,它直接把URL對應到類里面的方法,不是網頁文件或者資源,而是方法,這些方法就是【控制器】,控制器負責處理傳入的HTTP請求,接收用戶的表單數據,檢索或者保存數據,確定返回到瀏覽器的內容,一個新的動態HTML或者下載文件,或者跳轉等。
個人觀點:我覺得controller功能有點像業務邏輯層,負責核心的任務,處理,但是 又不全是。這里可以讀一下這篇文章:MVC與三層架構的終極區別
內容
添加第一個控制器
// 備注:前一篇的截圖都是運行結果和安裝軟件的步驟,所以沒有親自截圖,從本篇開始,所有截圖全部是我自己邊做邊寫,我用的是WIN8+VS2012,希望大家看着不會別扭。
開始為MVCMusicStore添加第一個控制器,命名為“HomeController”,右鍵 Controllers 文件夾 添加 選擇 控制器
可以看到添加好之后的HomeController 代碼:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace MvcMusicStore.Controllers
8 {
9 public class HomeController : Controller
10 {
11 //
12 // GET: /Home/
13
14 public ActionResult Index()
15 {
16 return View();
17 }
18
19 }
20 }
為了更簡單一點,我們更改 Index()方法的返回值類型和返回值如下:
{
return " Hello from Home ";
}
現在可以第一次運行項目了,按F5或者點擊綠色箭頭:
運行之前會編譯,之后會調用內置的Asp.net 開發版服務器, 右下角顯示通知,包括應用程序端口以及啟動/停止操作。
然后,會自動打開瀏覽器訪問我們的應用程序如下圖:
怎么樣?很簡單吧,不過,這只是開始!
備注:VS自帶Asp.net 服務器, 它將會為我們的應用程序隨機配置一個端口號,比如我的就是21222,當然你的也可能是別的,但是都一樣,本系列教程里的路徑都是基於http://locaohost:21222/的,比如/Store/Browse,就是http://locaohost:21222/Store/Brows
其實這里和之前的IIS差不多,就是廢話。
添加一個 新的控制器 StoreController
我們已經添加了一個非常簡單的HomeController實現在我們的網站的首頁,現在,添加另一個控制器用來實現音樂瀏覽功能,StoreController將有三個功能:
- 音樂風格列表;
- 某一風格的所有音樂;
- 某一音樂的詳細信息;
新的控制器創建完之后有一個默認方法:Index(),我們將用它來返回所有風格列表,並且,我們要添加另外兩個方法:
Browse:用來瀏覽某一風格的音樂列表;
Details:用來查看單個音樂的詳細信息;
這三個方法叫做“Controller Actions”,他們都要處理URL請求並且將處理結果反饋給瀏覽器;
添加好之后的三個方法如下(簡單起見,還是先用字符串開始):
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace MvcMusicStore.Controllers
8 {
9 public class StoreController : Controller
10 {
11 //
12 // GET: /Store/
13 public string Index()
14 {
15 return " Hello from Store.Index() ";
16 }
17 //
18 // GET: /Store/Browse
19 public string Browse()
20 {
21 return " Hello from Store.Browse() ";
22 }
23 //
24 // GET: /Store/Details
25 public string Details()
26 {
27 return " Hello from Store.Details() ";
28 }
29
30 }
31 }
直接按Shift + F6重新生成,或者直接按F5運行程序,完成之后,在瀏覽器打開:
- /Store
- /Store/Browse
- /Store/Details
將分別看到相應方法的返回值,和HomeController一樣。
怎么樣?感覺不錯吧,不過這些都是一些直接的值,我們給他擴展一下讓他變成動態的,能夠接收數據、處理並返回到瀏覽器。
首先我們為Browser方法添加一個genre參數 用來接收Url的參數,這樣當mvc 解析器調用Browse方法時就會自動把URL里的 genre 參數傳進來。
更新后的方法:
2 // GET: /Store/Browse?genre=Disco
3 public string Browse( string genre)
4 {
5 string message = HttpUtility.HtmlEncode( " Store.Browse, Genre = "
6 + genre);
7
8 return message;
9 }
備注:HttpUtility.HtmlEncode方法用來給輸入數據“消毒”,防止用戶注入類似 /Store/Browse?Genre=<script>window.location=’http://hackersite.com’</script>的javascript程序
現在,重新生成並且訪問: /Store/Browse?Genre=Disco
從第二個運行結果可以看出,的確是可以防止JS注入的。
現在我們為Details加入參數:ID。這里要特別提示:Asp.netMvc規則允許參數名為ID的參數在URL中不用輸入參數名,而直接傳入參數:(/store/details?id=5)Equals(/store/details/5):
2 //
3 // GET: /Store/Details/5
4 public string Details( int id)
5 {
6 string message = " Store.Details, ID = " + id;
7
8 return message;
9 }
重新生成並執行:
執行結果可以看出,的確如此。
到這里,本節已經基本結束,回顧一下:
- 建立一個新的Asp.net Mvc 應用程序;
- 介紹Mvc的基本文件目錄結構;
- 運行Mvc程序;
- 添加控制器:HomeController和StoreController;
- 接收URL參數並返回處理結果到瀏覽器;
后記
本節簡單介紹了控制器工作的基本流程,入手非常簡單,堪稱Mvc HelloWord。其實原理非常簡單:Mvc以及Route路徑控制直接把請求解析到控制器方法(關於這點可以查看:http://www.cnblogs.com/artech/archive/2012/03/26/mvc-routing-01.html 將有助於理解MVC路由映射),控制器處理之后返回到視圖,解析完成之后返回給瀏覽器。下篇將介紹試圖和模型。