MVC路由:由于路由global中注册了,在程序第一次运行时,在MVC会自动生成路由,类似于字典的格式缓存下来,但路由生成的规则又是怎样的呢?

路由生成规则是:

1》更具你定义的的顺序查找路由规则,如果有匹配的,就会生成路由,生成一条后,不会继续查找下去,结束第一条路由的生成,从而接着一样的方法第二第三条生成

2》那是怎么查找路由的呢?我们来看下面代码来解释:

            routes.MapRoute(
name: "Test",
url: "{controller}/{action}/{param1}",
defaults: new
{
controller = "Test",
action = "Index",
param1 = UrlParameter.Optional,
},
constraints: new
{
controller = "^Test.*",
action = new ActionConstraints(),// "^transfer.*",
param1 = @"\d+",
}
);

1》在这里假设我们当前路由是在顺序的第一,一开始在读取路由规则,都是先读这条,如果你的constraints规则不适应才会寻找下一跳生成路由,如果符合,就会直接生成路由,接着重新遍历这规则,生成下一跳路由

一,项目有需求将项目地址中的参数名不显示给用户看

在MVC定义一个方法:

     public ActionResult GetUserInfo(string Name, string Grade)
{
ViewBag.Name = Name;
ViewBag.Grade = Grade;
return View();
}

根据一般请求路径,我们请求的地址为:http://localhost:17273/Home/GetUserInfo?Name=1&Grade=1&Course=1,如果需要不显示参数名,将地址改成这种http://localhost:17273/Home/GetUserInfo/1/1/1形式,而此时我们需要添加路由规则

1>找到MVC的路由文件RouteConfig.cs

2>在文件中添加一条路由,如下

            routes.MapRoute(
name: "Querylll",
url: "{controller}/{action}/{Name}/{Grade}/{Course}",
defaults: new
{
controller = "Home",
action = "Index",
Name = UrlParameter.Optional,
Course = UrlParameter.Optional
},
namespaces: new string[] { "RouteDemo.Controllers" }
);

UrlParameter.Optional的定义是允许不传,造成结果是:http://localhost:17273/Home/GetUserInfo/1/1这条路由也是可以寻到该页面
3>我们定义一个新的方法测试以上结论如下:
     public ActionResult GetList(string Name, string Grade, string Course)
{
ViewBag.Name = Name;
ViewBag.Grade = Grade;
ViewBag.Course = Course;
return View();
}
PS:但我们需要注意的一点就是:如果你需要第三个字(Course)不为空值,我们必须要传Grade,因为根据路由规则,我们是通过URL的位置匹配参数
4>那我们使用实体接受是否可以?如下:
       public ActionResult GetListModel(UserName u)
{
ViewBag.Name = u.Name;
ViewBag.Grade = u.Grade;
ViewBag.Course = u.Course;
return View();
}
public class UserName
{
public string Name { get; set; }
public string Grade { get; set; }
public string Course { get; set; }
}

PS:实体的定义也需要符合参数循序和规则

二,到此时,就有疑问了,如果我们的参数明会变化,那我们不就需要N条路由?这明显不合理,那以上路由就需要改进了,如下

       routes.MapRoute(
name: "Query",
url: "{controller}/{action}/{param}/{param1}/{param2}",
defaults: new
{
controller = "Home",
action = "Index",
param = UrlParameter.Optional,
param1 = UrlParameter.Optional,
param2 = UrlParameter.Optional
},
namespaces: new string[] { "RouteDemo.Controllers" }
);

调用和获取的方法:

     public ActionResult GetListModel(UserName u)
{
u.Name = isNull("param") ? u.Name : QueryString("param").ToString();
u.Grade = isNull("param1") ? u.Grade : QueryString("param1").ToString();
u.Course = isNull("param2") ? u.Course : QueryString("param2").ToString();
ViewBag.Name = u.Name;
ViewBag.Grade = u.Grade;
ViewBag.Course = u.Course;
return View();
}
     public object QueryString(string paramname)
{
return System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values[paramname]; }
public bool isNull(string param)
{
return QueryString(param) == null ? true : false;
}

PS,这条路由解决了参数定义的顺序问题和参数名字变化等需求问题,若同一个方法有五个参数,但是当被调用时,传如参数可能是1个,2个等情况

三,那如果我们要写一个路由,只能是某一个控制器,并且是该控制器下某些方法可用,这是路由该怎么定义?如下代码:

         routes.MapRoute(
name: "Test",
url: "{controller}/{action}/{param1}/{param2}/{param3}/{param4}",
defaults: new
{
controller = "Test",
action = "Index",
param1 = UrlParameter.Optional,
param2 = UrlParameter.Optional,
param3 = UrlParameter.Optional,
param4 = UrlParameter.Optional,
},
constraints: new
{
controller = "^Test.*",
action = new ActionConstraints(),// "^Test.*",
}
);

我们需要在constrationts定义controllers的默认值即可,action我们就需要使用正则来判断,如下代码

        public class ActionConstraints : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
string val = values[parameterName].ToString();
if (Regex.IsMatch(val, "^Test.*", RegexOptions.IgnoreCase) || Regex.IsMatch(val, "^Index.*", RegexOptions.IgnoreCase))
{
return true;
}
return false;
}
}
^Test.表示当action前缀为Test都返回true,则可以使用这条路由
PS:如果想以上这种路由没有定义controllers规则,属于主路由,主路由不可以定义在从路由之前,这样如果生成匹配了主路由,从路由就不会生成,则你定义的规则就不会被实现

四,一个基于属性的路由配置工具使用博客AttributeRouting,可以给特定的action定义路由特定的规则:AttributeRouting

      [GET("test/ddd/{a}/{b}")]
public ActionResult TestRouting(string a, string b)
{
ViewBag.Name = a;
ViewBag.Grade = b;
return View();
}

MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则的更多相关文章

  1. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  2. ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

    一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...

  3. 前端MVC Vue2学习总结(八)——前端路由

    路由是根据不同的 url 地址展示不同的内容或页面,早期的路由都是后端直接根据 url 来 reload 页面实现的,即后端控制路由. 后来页面越来越复杂,服务器压力越来越大,随着AJAX(异步刷新技 ...

  4. ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...

  5. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  6. NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介   概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...

  7. 关于AngularJs中的路由学习总结

    AngularJs中的路由,应用比较广泛,主要是允许我们通过不同的url访问不同的内容,可实现多视图的单页web应用.下面看看具体怎么使用. 关于路由  通常我们的URL形式为http://jtjds ...

  8. vue路由跳转时判断用户是否登录功能

    通过判断该用户是否登录过,如果没有登录则跳转到login登录路由,如果登录则正常跳转. 一丶首先在用户登录前后分别给出一个状态来标识此用户是否登录(建议用vuex): 简单用vuex表示一下,不会可以 ...

  9. 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版

    代码走查25条疑问   代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...

随机推荐

  1. 如何启用Nginx的status功能,查看服务器状态信息?

    如何查看服务器状态信息? 我们可以通过安装Nginx的功能模块,并修改Nginx的主配置文件来实现. 1.编译安装时使用--with-http_stub_status_module开启状态页面模块 [ ...

  2. Nginx安装与配置-Centos7

    Nginx是一款高性能免费开源网页服务器,也可用于反向代理和负载均衡服务器.该软件由伊戈尔·赛索耶夫于2004年发布,2019年3月11日,Nginx被F5 Networks以6.7亿美元收购.201 ...

  3. 【CF】38E Let's Go Rolling! (dp)

    前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以 ...

  4. 三、MyBatis-全局配置文件

    XML 映射配置文件(官方结构) MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: configura ...

  5. python的list拷贝

    有三种情况 第一种:赋值(不是拷贝) a=[1,2,3] b=a 这种不是拷贝,a和b是一个变量,内存是一个 第二种:浅拷贝 a=[1,2,3,[4,5,6]] b=a b的第一层是独立的,第二层会更 ...

  6. php array_slice()函数 语法

    php array_slice()函数 语法 作用:在数组中根据条件取出一段值,并返回.大理石平台支架 语法:array_slice(array,start,length,preserve) 参数: ...

  7. 四-2、Move、fix、unfix命令

    1.Move命令--移动命令 1.对应的菜单和工具栏 2.以移动单个器件为例(以推荐的操作步骤进行操作)(具体步骤如下) 1--光标位于元件的原点 2--光标位于元件的几何中心 3--光标位于鼠标单击 ...

  8. python_012

    一.内置函数 1.sorted()排序函数 a:语法sorted(Iterable,key = None,reverse = False) Iterable:可迭代对象;key:排序规则(函数) ls ...

  9. Linux远程登录工具XShell安装

    Xshell就是一个远程控制RHEL的软件:其他的还有很多,用什么都无所谓(根据公司情况). 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一步:(免费的功能足够用了) 点接受 ...

  10. loj#2332 「JOI 2017 Final」焚风现象

    分析 我们发现改变一个区间实际上只有两个端点的贡献变换 代码 #include<bits/stdc++.h> using namespace std; #define int long l ...