014. MVC5路由规则/如何调试路由规则和调试过程/路由实例解释

可以在appStart→RouteConfig.cs中注册路由,MVC5中路由的规则:

  1. 可以创建多条路由规则,, 每条 路由规则的name不能相同, 相当于Key了
  2. 路由规则是有顺序的,如果被前面的规则匹配了, 那么后面的就没有机会了; 所以说同路由器上的规则是一模一样的, 越是严格的约束越要放在最前面;  以前一直不知道为什么这里称作路由; 现在终于理解了, 真的就像在路由器上配置的路由地址一样的作用
  3. 路由规则的作用:可以允许随意修改不同页面的URL的请求格式
  4. 应用程序一启动, 路由规则已经注册好了 , 并且放到路由表中了
  5. Route对象: 路由规则
  6. RouteData: 被匹配到的路由规则所传递的参数
  7. RouteCollection:路由规则集合
  8. RouteTable : 路由规则存放表

新建一个路由规则, 然后尝试访问, 其实在下图中如果把第二条路由放到第一条路由的上面, 就不会报错了:

如何调试路由规则和调试过程:

新建一个目录(Lib)→然后将RouteDebug.dll (需要下载)文件放到该目录中, 然后在引用中将其添加进来

打开Global.asax文件:

namespace MasterDemo
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //添加一行, 重写Routes到Testing, 将routes这个规则集合作为参数传入
            RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

 

预览下index页面, 然后会看到其中有那一条路由规则被匹配上, 路由的参数是什么,

 

添加路由约束:

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
                },
                //使用正则表达式添加一个路由约束, 约束该控制器必须是一个数字, 当然一般情况下, 这个约束用来约束参数
                constraints: new
                {
                    Controller = @"^\d+$"
                }, 
                //指定控制器在搜索的时候, 只能到一下数组内的命名空间中搜索, 以此提高性能
                namespaces: new string[]
                {
                    "MasterDemo"
                }

            );

            //第二个路由规则
            routes.MapRoute(
                name: "Default2",
                url: "{controller}-{action}", //使用横线分割
                defaults: new
                {
                    controller = "Home",
                    action = "Index",
                    id = UrlParameter.Optional
                }
            );
        }
    }

 添加约束后的第一次访问:

实例解析:

对于一个网站, 为了SEO友好, 一个网址的URL地址层次最好不要超过三层: http://域名/{频道}/{具体页面};

            #region 酒店频道部分
            // hotels/list-beijing-100,200-3
            //表示必须以为hotels开头, 然后是城市品应, 价格区间{100,200}, 然后是星级; 当然如果不给, 就使用默认值
            routes.MapRoute(
              name: "酒店列表页",
                url: "hotels/{action}-{city}-{price}-{star}",
              defaults: new
              {
                  controller = "Hotel",
                  action = "list",
                  city = "beijing",
                  price = "-1,-1",
                  star = "-1"
              },
              constraints: new
              {//这里这些都是约束, 约束城市必须是拼音(英文),价格是数字, 星级从-1到5之间
                  city = @"[a-zA-Z]*",
                  price = @"(\d)+\,(\d)+",
                  star = "[-1-5]"
              }
              );

            //hotels/所有匹配
            routes.MapRoute(
            name: "酒店首页",
            url: "hotels/{*values}",
            //所有的路由规则, 但凡遇到*, 那么就表示其后的字符串可以是任意字符串了
            defaults: new
            {
                controller = "Hotel",
                action = "default",
                hotelid = ""
            }
             );
            #endregion

            //网站首页.
            routes.MapRoute(
             name: "网站首页",
             url: "{*values}",
             defaults: new
             {
                 controller = "Home",
                 action = "index"
             }
              );
            //以上路由是有顺序的, 如果前面两个规则没有匹配上, 就必须匹配第三个, 那结果就是转到网站首页

 

posted on 2017-02-20 14:34  印子  阅读(204)  评论(0)    收藏  举报

导航