我的MVC之旅(2)--------MVC Music Store 第二篇 controller 控制器 [翻譯]


前言

前一篇介紹了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 代碼:

 1  using System;
 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()方法的返回值類型和返回值如下:

  public  string  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將有三個功能:

 

    1. 音樂風格列表;
    2. 某一風格的所有音樂;
    3. 某一音樂的詳細信息;
現在,停止應用程序的運行,添加一個新的控制器:StoreController

 

新的控制器創建完之后有一個默認方法:Index(),我們將用它來返回所有風格列表,並且,我們要添加另外兩個方法:

Browse:用來瀏覽某一風格的音樂列表;

Details:用來查看單個音樂的詳細信息;

這三個方法叫做“Controller Actions”,他們都要處理URL請求並且將處理結果反饋給瀏覽器;

添加好之后的三個方法如下(簡單起見,還是先用字符串開始):

 1  using System;
 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 參數傳進來。

  更新后的方法:

1  //
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):

1         
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         } 

  重新生成並執行:

執行結果可以看出,的確如此。

到這里,本節已經基本結束,回顧一下:

 

    1. 建立一個新的Asp.net Mvc 應用程序;
    2. 介紹Mvc的基本文件目錄結構;
    3. 運行Mvc程序;
    4. 添加控制器:HomeController和StoreController;
    5. 接收URL參數並返回處理結果到瀏覽器;

 

后記

本節簡單介紹了控制器工作的基本流程,入手非常簡單,堪稱Mvc HelloWord。其實原理非常簡單:Mvc以及Route路徑控制直接把請求解析到控制器方法(關於這點可以查看:http://www.cnblogs.com/artech/archive/2012/03/26/mvc-routing-01.html 將有助於理解MVC路由映射),控制器處理之后返回到視圖,解析完成之后返回給瀏覽器。下篇將介紹試圖和模型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM