Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 2 1 URL routing (Định tuyến URL) 1.1 Giới thiệu định tuyến URL 1.1.1 H thnh tuyn trong ASP.NET MVC làm gì? ASP.NET MVC Framework có mt h thnh tuyn URL ( URL Routing System ) linh hot cho phép xác nh các quy tc ánh x a ch URL bên trong ng dng. Mt h thnh tuyn có 2 m Xây dng mt tp hp các URL ng dng nh tuyn chúng ti các Controller và thc thi các x lý. Xây dng các URL g có th gc tr li Controllers/Actions ( ví d: form posts, liên kt <a i gi AJAX ) S dng các quy tc ánh x URL u khi m do cho vic lp trình ng dng, nu mui cu trúc URL ( ví d /Catalog thành /Products ) có th i mt tp hp quy tc ánh x mc ng dng mà không cn phi vit li mã lp trình bên trong Controllers và Views. 1.1.2 Các quy tnh tuyn URL mnh trong ASP.NET MVC Web Application Mnh khi to ng dng vi ASP.NET MVC Web Application trong Visual Studio s to ra mt ASP.NET Application class gi là Global.asax cha cu hình các quy tnh tuyn URL. Xây dnh tuyn thông c RegisterRoutes(ReouteCollection routes) và khi ng dng b u, c Application_Start() trong Global.asax.cs s g to ra bnh tuyn. Global.asax.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace BanHang { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { 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 = "" } // Parameter defaults ); } Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 3 protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } } Mnh tuyn URL trong ASP.NET MVC Framework có cu trúc dng: Controllers/ControllerAction/Id Vi ASP.NET MVC Web Application thì mnh Controllers là HomeController, mnh ControllerAction là Index, m nh Id là r i tran c xây dng thông qua template ASP.NET Web Application thì mnh http://localhost/ vi http://localhost/Home/Index/ Khi ng dng ASP.NET MVC Web Application nhc mt Url, MVC Framework s nh giá các quy tc nh tuyn trong tp h quynh Controller nào s u khin request. MVC framework chn Controller bnh giá các quy tc trong bnh tuyn theo trt t sn. 1.2 Ví dụ định tuyến URL .NET MVC Web Application: To TimKiem URL Figure 1. To controller TimKiemController.cs Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 4 Có 2 action trong TimKiem hin th mt trang search vi mi dùng nhp t khóa c u khin khi yêu cu tìm kinh. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace BanHang.Controllers { public class TimKiemController : Controller { public ActionResult Index() { // Add action logic here return View(); } public ActionResult Results(string query) { return View(); } } } Trong Global.asax.cs mt cách thnh tuyn mnh. Theo quy tnh tuyn mnh thì khi yêu cu mt trang tìm kia ch c gi theo s ng vi [controller]/[action]/[id] là /TimKiem/Results/[string query]. Cách dùng này không có v gu mt cách tùy binh tuy i thành /TimKiem/[string query]. Thêm vào trong Global.asax.cs: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace BanHang { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "TimKiem", // Route name "TimKiem/{query}", // URL with parameters new { controller = "TimKiem", action = "Results" } // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 5 new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } } To 2 view hin th d liu khin trong TimKiemController.cs là Index.aspx và Results.aspx Index.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="BanHang.Views.TimKiem.Index" %> <asp:Content ID="viewTimKiem" ContentPlaceHolderID="MainContent" runat="server"> <form method="post" action="TimKiem/Search"> <input type="text" id="txtTimKiem" name="txtTimKiem" /> <input type="submit" value="Tìm Kiếm" /> </form> </asp:Content> Result.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Results.aspx.cs" Inherits="BanHang.Views.TimKiem.Results" %> <asp:Content ID="viewResults" ContentPlaceHolderID="MainContent" runat="server"> Kết quả dữ liệu tìm kiếm được ở đây </asp:Content> Thêm vào Views\Shared\Site.master mt tab tìm kim <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="BanHang.Views.Shared.Site" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title><%= Html.Encode(ViewData["Title"]) %></title> <link href=" / /Content/Site.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="page"> <div id="header"> <div id="title"> <h1>My Sample MVC Application</h1> </div> <div id="logindisplay"> <% Html.RenderPartial("LoginUserControl"); %> </div> <div id="menucontainer"> <ul id="menu"> <li><%= Html.ActionLink("Home", "Index", "Home")%></li> Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 6 <li><%= Html.ActionLink("Sản phm", "Index", "SanPham")%></li> <li><%= Html.ActionLink("Tìm kiếm", "Index", "TimKiem")%></li> <li><%= Html.ActionLink("About Us", "About", "Home")%></li> </ul> </div> </div> <div id="main"> <asp:ContentPlaceHolder ID="MainContent" runat="server" /> <div id="footer"> My Sample MVC Application © Copyright 2008 </div> </div> </div> </body> </html> ( Figure 2) Figure 2 .cs 2 Điều phối hiển thị dữ liệu ViewData là thành phn quan trng trong vic hin th d liu ca ASP.NET MVC Framework. wData dictionary . /value ( [] = ). 2.1 Điê ̀ u phô ́ i hiê ̉ n thi ̣ dư ̃ liê ̣ u vơ ́ i ViewData Dictionary SanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 7 using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(string loaisanpham) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(loaisanpham); return View("DanhSachSanPham", sp); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } } } 2 : 1 <%= %> trong code, 2 ng <%= %> Views\SanPham\DanhSachSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="DanhSachSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.DanhSachSanPham" %> <asp:Content ID="viewDanhSachSanPham" ContentPlaceHolderID="MainContent" runat="server"> <h1>Đây là danh sách sản phẩm có trong chuyên mục</h1> <ul> <% foreach (var sp in ViewData.Model) { %> Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 8 <li> <%= Html.ActionLink(sp.TenSanPham , "ChiTietSanPham/" + sp.Id, "SanPham") %> </li> <% } %> </ul> </asp:Content> Views\SanPham\DanhSachSanPham.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using BanHang.Models; namespace BanHang.Views.SanPham { public partial class DanhSachSanPham : ViewPage <List<BanHang.Models.SanPham>> { } } Bind Da -behide Views\SanPham\DanhSachSanPham.aspx.cs ViewData, <asp:DataList>. WebForm nên trong Views\SanPham\DanhSachSanPham.aspx sinh ID ( 00_listView ), . Views\SanPham\DanhSachSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="DanhSachSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.DanhSachSanPham" %> <asp:Content ID="viewDanhSachSanPham" ContentPlaceHolderID="MainContent" runat="server"> <h1>Đây là danh sách sản phẩm có trong chuyên mục</h1> <asp:DataList ID="listView" runat="server"> <ItemTemplate> <%= Html.ActionLink(Eval("TenSanPham") , "ChiTietSanPham/" + Eval("Id"), "SanPham") %> </ItemTemplate> </asp:DataList> </asp:Content> Views\SanPham\DanhSachSanPham.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using BanHang.Models; namespace BanHang.Views.SanPham Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 9 { public partial class DanhSachSanPham : ViewPage <List<BanHang.Models.SanPham>> { public void Page_Load() { listView.DataSource = ViewData["SanPham"]; listView.DataBind(); } } } 2.2 Điê ̀ u phô ́ i hiê ̉ n thi ̣ dư ̃ liê ̣ u vơ ́ i cch dng Strongly Typed Classes 2.2.1 - C# . .aspx. #. . 2.2.2 -typed DuLieuDanhSachSanPham trong folder Models DuLieuDanhSachSanPham.cs using System; using System.Data; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace BanHang.Models { public class DuLieuDanhSachSanPham { Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 10 public string TenLoaiSanPham { get; set; } public List<Models.SanPham> SanPham { get; set; } } } SanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(string loaisanpham) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; //List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", sp); DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); ViewData.TenLoaiSanPham = loaisanpham; ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); return View("DanhSachSanPham", ViewData); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } } } Microsoft Vietnam – DPE Team | Bài số 4: Định tuyến URL và điều phối hiển thị 11 2.2.3 Trong Views\SanPham\DanhSachSanPham.aspx SanPhamController. , . <T> ASP. . ViewPage<T> ( ) Views\SanPham\DanhSachSanPham.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using BanHang.Models; namespace BanHang.Views.SanPham { public partial class DanhSachSanPham : ViewPage <DuLieuDanhSachSanPham> { public void Page_Load() { } } } 3 Câu ho ̉ i ôn tâ ̣ p Hi: , ? Đa ́ p: , 2 : . . . Hi: Trong mt ng dng MVC, liu có tn ti 1 mô hình d liu Models, có n Controllers, mu khin m Views không? Đáp: Có. Thc cht vic to ra mô hình MVC chính là mt cách th hin lp trình i mt mô hình d lic xây dng các Controllers khác nhau cùng truy cn mô hình d lic hic. Mi Controllers s có nhing vi m Views. 4 Ti liệu tham kho http://asp.net/mvc http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from- controllers-to-views.aspx . 4 Ti liệu tham kho http:/ /asp. net/ mvc http://weblogs .asp. net/ scottgu/archive/2007/12/ 03 /asp- net- mvc-framework -part- 2-url-routing.aspx http://weblogs .asp. net/ scottgu/archive/2007/12/06 /asp- net- mvc-framework -part -3- passing-viewdata-from- controllers-to-views.aspx. tnh tuyn URL mnh trong ASP. NET MVC Web Application Mnh khi to ng dng vi ASP. NET MVC Web Application trong Visual Studio s to ra mt ASP. NET Application class gi là Global.asax. Team | Bài số 4: Định tuyến URL và điều phối hiển thị 2 1 URL routing (Định tuyến URL) 1.1 Giới thiệu định tuyến URL 1.1.1 H thnh tuyn trong ASP. NET MVC làm gì? ASP. NET MVC Framework