MusicStore 項目的完整配套視頻!
在典型的 Web 應用程式中,使用者請求的 URL 地址通常映射到儲存在網站中的檔案上,例如,當使用者請求 /Products.aspx 的時候,或者 /Products.php 的時候,很可能是在通過處理 Products.aspx 或者 Products.php 檔案來完成任務。
ASP.NET MVC 的處理方式則不同,它沒有映射到檔案上,相反,將這些 URL 地址映射到類的方法上,這些類被稱為“控制器”,控制器用來接受 HTTP 要求,處理使用者的輸入,擷取或者儲存資料,其中的處理方法稱為 Action,然後將回應發送到用戶端,可能是顯示了一個 HTML 的網頁,下載一個檔案,重新導向到另外一個地址等等。
預設的路由配置
在新建立的項目中,開啟 Global.asax.cs 檔案,可以看到如下的代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcMusicStore
{
// 注意: 有關啟用 IIS6 或 IIS7 傳統模式的說明,
// 請訪問 http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名稱
"{controller}/{action}/{id}", // 帶有參數的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值
);
}
// 一般用來進行網站的初始化
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
}
其中 RegisterRoutes 方法註冊了預設的路由配置,在方法中的 routes.MapRoute 語句中,請求地址將會被看成三個部分組成,{controller}/{action}/{id},第一部分稱為控制器,如果沒有提供的話,預設為 Home, 第二部分稱為 Action 方法,如果沒有提供的話,預設為 Index, 第三部分稱為 id, 通常用來提供資料的標識,沒有預設值。這樣,當請求 / 地址的時候,系統將會把請求映射到名為 Home 的控制器進行處理,調用其中名為 Index 的方法處理請求。
增加 HomeController
我們的市集從增加一個首頁的控制器開始,使用預設的命名規範,控制器的名稱應該以 Controller 作為尾碼,我們將這個控制器命名為 HomeController。
在 Controller 檔案夾上右擊,然後選擇“添加”,“控制器(T)…”
在彈出的對話方塊中,輸入控制器的名字 HomeController,按下“添加”按鈕。
這樣,將會建立一個名為 HomeController.cs 的檔案,其中的代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcMusinStore.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
}
為了儘可能地簡單,我們讓 Index 方法簡單地返回一個字串,這個字串將作為回應內容直接返回瀏覽器,我們做下面的兩個簡單修改。
- 將方法的傳回型別修改為string
- 將返回語句修改為 return "Hello form Home";
這樣,我們的方法將會變成如下的內容
public string Index()
{
return "Hello form Home";
}
運行程式
現在,可以運行一下了,我們可以啟動伺服器,使用下面的任何一種方法都可以。
- 選擇“調試”,“啟動調試”菜單
- 點擊工具列上的綠色的箭頭按鈕
- 使用鍵盤快速鍵,F5
使用上面的任何一種方法都會導致編譯項目,啟動 Visual Studio 中內建的 ASP.NET 程式開發伺服器.
在螢幕的右下角會彈出一個啟動 ASP.NET 程式開發伺服器的提示,
Visual Studio 將自動開啟一個瀏覽器視窗,其中的地址指向我們的 Web 服務器,這使得我們可以快速使用我們的程式。
Ok, 非常的簡單,我們已經建立了一個 Web 網站,寫了一個三行的函數,在瀏覽器中得到了這行文字, 不是很震撼,但這僅僅只是開始。
增加 StoreController
我們已經為網站增加一個簡單的 HomeController 作為首頁,現在,增加另外一個控制器,可以用來瀏覽我們的音樂市集,我們的商店控制器將要支援三個情境:
- 列出商店中的唱片的分類
- 瀏覽商店中某個分類中的唱片列表
- 顯示特定唱片的詳細資料
我們從增加一個新的 StoreController 開始,先停止剛才的程式,可以直接關閉瀏覽器,或者也可以在調試菜單中,選擇停止調試。
現在,增加一個新的 StoreController,像在 HomeController 中做的一樣,我們在 Controllers 檔案夾上右健,選擇“添加”,“控制器”.
新的 StoreController 控制器中已經包含了 Index 方法,我們使用這個方法來實現列出所有分類的列表,我們還會再增加兩個額外的方法來實現其他的情境:瀏覽和明細。
這些包含在控制器中的方法,我們稱為控制器中的 Action,像你在前面看到的,HomeController 中的 Index 方法就是一個 Action,這些 Action 的作用就是處理請求,然後返回對請求的處理結果。
對於我們的 StoreController ,首先讓 Index 這個 Action 返回一個“Hello” 串,然後,增加兩個方法:Browse() 和 Detials()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcMusinStore.Controllers
{
public class StoreController : Controller
{
//
// GET: /Store/
public string Index()
{
return "Hello from Store.Index()";
}
public string Browse()
{
return "Hello from Store.Browse()";
}
public string Details()
{
return "Hello from Store.Details()";
}
}
}
重新運行程式,現在已經可以訪問這些地址了。
- /Store
- /Store/Browse
- /Store/Details
太棒了,但是現在僅僅能夠返回一些常量的字串,讓我們將它們變成動態,我們從 URL 中擷取一些資訊,然後把他們顯示在返回的頁面中。
首先,修改我們的 Browse 這個 Action,使得它可以從 URL 地址中擷取查詢資訊,為方法增加一個名為“genre” 的字串型別參數,當我們這樣做的時候,ASP.NET MVC 就會自動把任何名為 genre 的請求參數的值賦予這個參數。
//
// GET: /Store/Browse?genre=?Disco
public string Browse(string genre)
{
string message = HttpUtility.HtmlEncode("Store.Browse, Genre = " + genre);
return message;
}
注意:
我們使用了HttpUtility.HtmlEncode 方法來處理使用者的輸入,這樣可以防止使用者的指令碼插入式攻擊。例如:/Store/Browse?Genre=<script>window.location=’http://hackersite.com’</script>.
現在,我們在瀏覽器中訪問一下:/Store/Browse?Genre=Disco
下一步,我們處理 Details 這個 Action,使它能夠處理名為 ID 的整數型別參數。這次,我們不再在請求參數中傳遞這個整數,而是嵌在請求的 URL 地址中。例如:/Store/Details/5。
在 ASP.NET MVC 中,我們可以輕易地完成這個任務而不需要配置任何東西,ASP.NET MVC 預設的路由約定會將跟在 Action 方法之後的部分看作名為 ID 的參數的值,如果你的 Action 方法有一個名為 ID 的參數,那麼,ASP.NeT MVC 就會自動將這部分作為參數傳送給 Action 方法,需要注意的是,MVC 可以協助你完成資料類型之間的轉換,所以,地址的第三部分一定要可以轉換為整數。
//
// GET: /Store/Details/5
public string Details(int id)
{
string message = "Store.Details, ID = " + id;
return message;
}
再次運行程式訪問/Store/Details/5
總結一下我們完成的任務:
- 建立了一個 ASP.NET MVC 項目
- 討論了基本的專案檔夾
- 學習了如何運行程式開發伺服器
- 建立了兩個控制器 HomeController 和 StoreController
- 為控制器增加了 Action 方法。