014. MVC5路由规则/如何调试路由规则和调试过程/路由实例解释
可以在appStart→RouteConfig.cs中注册路由,MVC5中路由的规则:
- 可以创建多条路由规则,, 每条 路由规则的name不能相同, 相当于Key了
- 路由规则是有顺序的,如果被前面的规则匹配了, 那么后面的就没有机会了; 所以说同路由器上的规则是一模一样的, 越是严格的约束越要放在最前面; 以前一直不知道为什么这里称作路由; 现在终于理解了, 真的就像在路由器上配置的路由地址一样的作用
- 路由规则的作用:可以允许随意修改不同页面的URL的请求格式
- 应用程序一启动, 路由规则已经注册好了 , 并且放到路由表中了
- Route对象: 路由规则
- RouteData: 被匹配到的路由规则所传递的参数
- RouteCollection:路由规则集合
- 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"
}
);
//以上路由是有顺序的, 如果前面两个规则没有匹配上, 就必须匹配第三个, 那结果就是转到网站首页
浙公网安备 33010602011771号