2017年9月20日 星期三

[MVC] Routing Engine - Custom Routes (2)

  • Custom Routes
    • 使 URL 更簡單
    • 提高搜尋引擎排名 (Search Engine Ranking)
  • 安排 Route 順序
    • 先寫的 MapRoute 會先使用
    • 越特殊的放前面
    • 通用的放後面
  • 註冊 Custom Route 到 Route Table 物件
    • 呼叫 Routes.MapRoute() 方法
  • 因開起 MVC 空專案預設就會有一組 Route
    • 首頁指定為 controller = "Home", action = "Index"
    • 下列將創建一組特殊的 Route 進行試範
    • Setp 1:先建立 Home 的 Index
      • 可見下列結果
    • Setp 2:此設定加入一組 MapRoute 設定如下
      • url: "User/Name/{Age}":為網址位置
      • controller = "User":對應至 controller 
      • action = "UserName":對應至 action 
using System.Web.Mvc;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCRouting
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            // 忽略所有 *.axd 的網址路徑
            // 在預設 RegisterRoutes 方法中的 IgnoreRoute 用來定義 不要透過 Routing 處理的網址
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // Routing 網址路徑
            // MapRoute 則是最常用來定義 Routing 規則的擴充方法
            routes.MapRoute(
                name: "ShowUser",
                url: "User/Name/{Age}",  
                defaults: new
                {
                    controller = "User",
                    action = "UserName",
                    Age = UrlParameter.Optional
                }
            );

            routes.MapRoute(
                name: "Default",                    // 路由名稱:唯一名稱對應唯一的 Route
                url: "{controller}/{action}/{id}",  // URL 及參數:通過簡單的模式,將 URL 解析具有意義的字段
                defaults: new                       // 參數預設值
                {
                    controller = "Home",            // 默認值:提供與對應字段的默認值
                    action = "Index",
                    id = UrlParameter.Optional
                    // constraints                  // 約束:一系列的約束應用到 URL 模式上
                                                    //       用來嚴格定義 URL 對應 Route
                } 
            );
        }
    }
}
    • Setp 3:controller 名稱與 action 名稱需對應至 MapRoute
using System.Web.Mvc;

namespace MVCRouting.Controllers
{
    public class UserController : Controller
    {
        // GET: User
        public ActionResult UserName()
        {
            return View();
        }
    }
}
    • Setp 4:目錄結構會如下,並進行測試
      • 輸入 /User/UserName 與 /User/User 會導引至相同頁面
  • MVC 5 Attribute Routing
    • MVC 5 新功能 Attribute Routing 
    • 啟用  Attribute Routing 
      • RouteConfig.cs 文件中調用 MapMvcAttributeRoutes 方法
    • Action Method 套用
    • Setp 1:修該 RouteConfig.cs

using System.Web.Mvc;
using System.Web.Routing;

namespace MVCRouting
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            // 忽略所有 *.axd 的網址路徑
            // 在預設 RegisterRoutes 方法中的 IgnoreRoute 用來定義 不要透過 Routing 處理的網址
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // Routing 網址路徑
            // MapRoute 則是最常用來定義 Routing 規則的擴充方法
            routes.MapMvcAttributeRoutes();         //Attribute Routing


            routes.MapRoute(
                name: "Default",                    // 路由名稱:唯一名稱對應唯一的 Route
                url: "{controller}/{action}/{id}",  // URL 及參數:通過簡單的模式,將 URL 解析具有意義的字段
                defaults: new                       // 參數預設值
                {
                    controller = "Home",            // 默認值:提供與對應字段的默認值
                    action = "Index",
                    id = UrlParameter.Optional
                    // constraints                  // 約束:一系列的約束應用到 URL 模式上
                                                    //       用來嚴格定義 URL 對應 Route
                } 
            );
        }
    }
}
    • Setp 2:Action Method 套用 Attribute Routing 
      • {Age?} 為 Age = UrlParameter.Optional
      • 如 {Age} 為必要參數
      • 初使值 {Age = 30}

using System.Web.Mvc;

namespace MVCRouting.Controllers
{
    public class UserController : Controller
    {
        [Route("User/Name/{Age?}")]
        public ActionResult UserName()
        {
            return View();
        }
    }
}
    • Setp 3:測試,因為設定為 Attribute Routing ,原本網頁將會找不到
  • RouteData.Values Controller
    • Action Method 使用 RouteData.Values 集合讀取路由資訊
        [Route("User/Name/{Age?}")]
        public ActionResult UserName()
        {
            ViewBag.mycontroller = RouteData.Values["controller"];
            ViewBag.myaction = RouteData.Values["action"];
            ViewBag.myage = RouteData.Values["Age"];
            return View();
        }
      • 或者
        [Route("User/Name/{Age?}")]
        public ActionResult UserName(string age)
        {
            ViewBag.mycontroller = RouteData.Values["controller"];
            ViewBag.myaction = RouteData.Values["action"];
            ViewBag.myage = age;
            return View();
        }
    • View
    <hi>Lyndon</hi>
    @ViewBag.mycontroller
    @ViewBag.myaction
    @ViewBag.myage

沒有留言:

張貼留言