路由匹配的几点小结

(1)控制器和动作方法的名字不区分大小写。

        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("MyRoute", "{controller}/{action}",
new { Controller = "Home", Action = "Index"});
}

对于测试

       [TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/", "home", "index"); //通过
}

TestRouteMatch("~/AAA/BBB", "aaa", "bbb");  //通过

TestRouteMatch("~/AAA", "aaa", "Index");    //通过

(2)可以使用静态URL片段,使路由只匹配地址中某一部分为固定值的URL

        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("", "Public/{controller}/{action}",
new { Controller = "Home", Action = "Index" });
}

对于测试:


       [TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/Public/AAA/BBB", "AAA", "BBB");
TestRouteMatch("~/Public/AAA", "AAA", "Index");
TestRouteMatch("~/Public", "Home", "Index");
}

上面三种形式能通过测试,除此以外都不行。

(3)使用静态URL片段时要注意路由顺序


        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("MyRoute", "{controller}/{action}",
new { Controller = "Home", Action = "Index"});

routes.MapRoute("", "Public/{controller}/{action}",
new { Controller = "Home", Action = "Index" });
}

上面有两个路由,因此URL进来匹配的时候要注意顺序,从上往下,依次匹配。

这个时候,对于如下URL

"~/Public"

就匹配不了第二个路由了,因为按照从上往下的顺序,在第一个路由匹配的时候就被拦截。

对于测试:


        [TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/Public/AAA/BBB", "AAA", "BBB"); //通过,第一个路由不匹配3段式,漏下来匹配第二个路由
TestRouteMatch("~/Public/AAA", "AAA", "Index"); //出错,两段式、一段式或"~/"都被第一个路由拦截。控制器应匹配为Public,动作为AAA
TestRouteMatch("~/Public", "Home", "Index"); //出错,被第一个路由拦截。控制器应匹配为Public,动作为Index
}

(4)使用静态URL片段将指定的旧地址重新映射到新的控制器和动作方法上


        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("ShopSchema2", "Shop/OldAction", //注意没有大括号是静态URL
new { Controller = "Home", Action = "NewAction"});

routes.MapRoute("ShopSchema", "Shop/{action}",
new { Controller = "Home", Action = "Index" });
}

对于测试:


        [TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/Shop/OldAction", "Home", "NewAction");
TestRouteMatch("~/Shop", "Home", "Index");
TestRouteMatch("~/Shop/AAA", "Home", "AAA");
TestRouteFail("~/AAA/BBB");
}

"~/Shop/OldAction" 将原来指定的这种URL重新映射到控制器Home、动作方法NewAction上。
"~/Shop"第一个路由不匹配,漏下来,匹配第二个路由,控制器默认为Home,动作方法没有给出来,默认为Index。
"~/Shop/AAA"第一个路由不匹配,匹配第二个路由,控制默认为Home,动作方法指定为AAA。
"~/AAA/BBB"没有匹配的路由,只定义了两个路由,都必须由静态地址~/Shop开头。
 
 
 

路由匹配的几点小结

时间: 2024-10-26 08:26:12

路由匹配的几点小结的相关文章

VS2013和VS2015中MVC 区域路由匹配顺序相反

创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改RouteConfig.cs中的路由注册方法,添加命名空间 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.M

Vue系列之 => 路由匹配

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6 <meta http-equiv="Content-Type"

Vue-router 动态路由匹配

Vue-router 动态路由匹配 路由参数变化 举例: const router = new VueRouter({ routes: [ // 动态路径参数 以冒号开头,  /user/foo 和 /user/bar 都将映射到相同的路由 { path: '/user/:id', component: User } ] }); /user/:username/post/:post_id 多个路由变量,也都可以再 this.$route.params中获取 注意: 从 /user/foo 到 /

四十七、django路由匹配,分组,反向解析,路由分发,视图层

路由匹配: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^text', views.text), url(r'^testadd', views.testadd), ] 第一个参数是一个正则表达式,也就意味着在路由的匹配的时候,是按照正则匹配的规则去匹配, 路由匹配的顺序是从上往下依次匹配,所有如上两个路由test前面一样,第三个路由一直会匹配不上 正确写法: urlpatterns = [ url(r'^admin/', adm

08.vue-router动态路由匹配

动态匹配路由的基本用法 思考: <!-有如下3个路由链接.-> <router-link to="/user/1">User1</router-link> <router-link to="/user/2">User2</router-link> <router-link to="/user/3">User3</router-link> //定义如下三个对应的路由

Go的http包中默认路由匹配规则

# 一.执行流程 首先我们构建一个简单http server: ```go package main import ( "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) log.Fatal(http.Liste

expressjs路由匹配规则

expressjs作为nodejs的MVC框架,其路由规则与大部分其他MVC框架类似,略有不同,研究后做个小记. expressjs路由在app.js中配置,app.js源码如下(不同的版本会有所不同,以下为express 4.13.1): 1 var express = require('express'); 2 var path = require('path'); 3 var favicon = require('serve-favicon'); 4 var logger = requir

Flask自定义转换器,实现路由匹配正则表达式参数

Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 1 # 路由传递的参数默认当做string处理 2 # 这里指定int,尖括号中冒号后面的内容是动态的 3 4 @app.route('/user/<int:id>') 5 def hello_itcast(id): 6 return 'hello itcast {}'.format(id) Flask默

vue版本根据当前路由匹配到根父节点并且激活

页面布局 我的项目是有两种布局方式的, 一种是左侧布局,还有一种是顶部+左侧的布局,在这里主要讲顶部+左侧布局  因为左侧的相对简单,会自行匹配 业务场景 当页面刷新的时候,要回到原来的页面,并且要激活正确的一级和二级菜单 首先  在data中创建数据 data() { return { menus: [],//菜单数据是id pid 加上children格式的 parentNodes: [] //最终调用函数返回的结果集 } }, 获取当前页面路由的id和pid let path = this