ASP.NET MVC學習(一)之路由篇Route

什麼是路由

經過【路由】配置,路由能夠規定URL的特殊格式,使其達到特殊效果。正則表達式

在ASP.NET MVC框架中,經過路由配置URL,使用戶的URL請求能夠映射到Controller下的action方法中,執行相應操做,並接受URL中傳過來的參數,框架

在MVC5框架中,在【RouteConfig.cs】類中進行路由規則的配置ide

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

參數的含義this

(1) name:  要映射的路由的名稱。url

(2) url:  路由的 URL 模式,能夠自定義路由的格式,能夠寫靜態路由,也能夠寫動態路由、組合路由等。spa

(3) defaults:  一個包含默認路由值的對象,書寫路由的默認值。3d

(4) constraints: 一組表達式,可使用正則指定 url 參數值的約束。code

(5) namespaces: 應用程序的一組命名空間,能夠縮小檢索路由對象匹配的範圍。htm

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
        {
            if (routes == null)
            {
                throw new ArgumentNullException("routes");
            }
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }
            Route route = new Route(url, new MvcRouteHandler()) {
                Defaults = CreateRouteValueDictionaryUncached(defaults),
                Constraints = CreateRouteValueDictionaryUncached(constraints),
                DataTokens = new RouteValueDictionary()
            };
            ConstraintValidation.Validate(route);
            if ((namespaces != null) && (namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = namespaces;
            }
            routes.Add(name, route);
            return route;

MVC中的幾類路由及其規則

 動態路由對象

        routes.MapRoute(
                 name: "Default",    //路由名稱
                 url: "{controller}/{action}/{id}",   //路由規則
                 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默認值,當Controller或action爲空(省略)的時候調用
             );

靜態路由

        routes.MapRoute(
                 name: "Default2",    //路由名稱
                 url: "Ypf",   //路由規則,不區分大小寫,當輸入「ypf」時,會自動跳轉到下面的地址
                 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默認值,當Controller或action爲空的時候調用
             );

組合路由

       routes.MapRoute(
              "Default4",    //路由名稱
              "Ypf/{action}",   //路由規則,不區分大小寫,規則相符的時候,會自動跳轉到下面的地址
               new { controller = "First", action = "Index1" }
          );

正則約束

        routes.MapRoute(
                "Default5",
                 "{controller}/{action}_{Year}_{Month}_{Day}",
                 new { controller = "First", action = "Index1", id = UrlParameter.Optional },
                 new { Year = @"^\d{4}", Month = @"\d{2}", Day = @"\d{2}" }
             );//正則路由

所謂的正則約束,是指能夠對URL中的參數使用正則表達式進行約束,上述代碼約束了Year必須是四位數字,Month和Day必須是兩位數字。

 命名空間約束

         routes.MapRoute(
                  name: "Default6",
                  url: "{controller}/{action}/{id}",
                  defaults: new { controller = "Third", action = "Index", id = UrlParameter.Optional },
                  namespaces: new string[] { "Ypf.MVC5" }
             );

所謂的命名空間約束,即限定匹配範圍路由的檢索範圍,提升檢索速度。

特別注意:不能從外層控制器直接跳轉到內層Area內的控制器!!

Area區域內的路由

public override void RegisterArea(AreaRegistrationContext context) 
        {
            //原路由
            //context.MapRoute(
            //    "TestOne_default",
            //    "TestOne/{controller}/{action}/{id}",
            //    new { action = "Index", id = UrlParameter.Optional }
            //);

            //結合命名空間進行路由改造
            context.MapRoute(
               this.AreaName + "_default",
               this.AreaName + "/{controller}/{action}/{id}",
               new { area = this.AreaName, controller = "Sys_Admin", action = "Index", id = UrlParameter.Optional },
               new string[] { "Ypf.MVC5.Areas." + this.AreaName + ".Controllers" }
           );

        }

 其餘

1.URL路徑和路由配置中的路徑對比

2.由上面的圖,咱們能夠得出下面的一組路由數據

 3.二義性

若是咱們在Models中也新建一個Home控制器,那麼你會發現從新刷新以後報錯了。而這個是由於沒法肯定到底選擇哪一個控制器來響應該請求的緣故,固然你認爲只要咱們不新建重名的控制器就能夠了,這樣你只能控制你的項目中不出現,可是你卻沒法控制你加載的類庫中不會出現,可是ASP.NET MVC已經提供瞭解決方案給咱們,以下改正

RouteConfig.cs:

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "MvcStudy.Controllers" }
            );
        }
    }

 咱們能夠看到namespaces參數,經過將命名空間的名稱傳進去就能夠起到排除二義性的問題了。

 4.約束路由

上面咱們有一個{id}用來捕獲參數的,可是你也發現了它能夠捕捉任何字符串等等,可是咱們有時須要限制它,好比讓它只能輸入數字,那麼咱們就可使用正則表達式去約束它。

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new{id = @"^\d*$"},
                namespaces: new[] { "MvcStudy.Controllers" }
            );
        }
    }

5.URL路由機制

6.MVC Area出現找到多個與名爲Home的控制器匹配的類型錯誤的解決方法

第一種方式:在RouteConfig中添加路由

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               name: "Admin",
               url: "Admin/{controller}/{action}/{id}",
               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空間
           );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "ASP.NETMVCProject.Controllers" }//添加命名空間
            );
        }
    }

第二種方式:在AdminAreaRegistration中添加命名空間

public class AdminAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
               namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空間
            );
        }
    }

7.顯示禁用路由

 8.自定義路由

routes.MapRoute(
 "Detail",// Route name
 "Expert/Detail/{q}.htm",// URL with parameters
 new { controller = "Expert", action = "Detail", q = "" }// Parameter defaults
);
相關文章
相關標籤/搜索