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();}

转载于:https://www.cnblogs.com/May-day/p/8446737.html

MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则相关推荐

  1. 计算机网络参数怎么看,电脑显示器参数详解 看完秒懂! 显示器参数怎么看?...

    显示器参数怎么看?无论是显示器的宣传.购买页面,还是专业媒体的显示器评测中,我们都会看到一些用来描述显示器性能的参数.小编觉着,显示器就像是电脑的一张面孔,显示着它的各种表情,也负责与用户的沟通,而显 ...

  2. 怎么查看笔记本内存条型号_笔记本配置参数怎么看 笔记本配置参数查看方法【详解】...

    在科技高速发展的时代,很多人都想拥有一台属于自己的电脑或者笔记本,在选购电脑或者笔记本时,我们总会面对一堆参数,虽然有些参数只要选数字大的准没错,但其具体代表什么意思,不少用户还真不知道,更不用说一些 ...

  3. 获取豆瓣用户看过的电影名以及评分,短评,标签等

    数据定向到mysql数据库中,并备份到本地文件 #/bin/bash# name: get_see_movies.sh # version: 1.0 # ceateTime: 2018-08-12 # ...

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

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

  5. koa --- [MVC实现之一]自定义路由读取规则

    实现MVC分层架构 目标是创建约定大于配置.开发效率高.可维护性强的项目架构 路由处理 规范 所有路由,都要放在routes文件夹中 若导出路由对象,使用 动词+空格+路径 作为key, 值是操作方法 ...

  6. php mvc 路由,PHP MVC框架路由学习笔记

    文章主要介绍了PHP MVC框架路由学习笔记的相关资料,需要的朋友可以参考下. 提到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来 ...

  7. php 自定义sql 脚手架,vue路由、自定义指令、脚手架

    *Vue vue-router 一.路由 一.导航式路由 路由路径由 标签配置 标签内 to属性值规定改标签指向的path路径: 路由对应视图 通过加载组件 加载到上 去首页 去新闻 配置路由的步骤: ...

  8. CCNP路由学习技巧

    什么是CCNP路由 CCNP路由学习技巧:CCNP考试一共有3个科目:1.高级路由(ROUTE)2.多层交换(SWITCH)3.排错和维护(TSHOOT).今天我们主要来讲一下高级路由的学习技巧. C ...

  9. linux路由相关函数,Linux 路由 学习笔记 之十一 输入、输出路由查找相关的接口函数...

    对于路由功能模块的学习,也已经很长时间了.关于路由项的创建与查找.策略规则相关的创建与查找.路由缓存的创建与查找,都是分开来分析的,没有说明这些模块是如何配合使用的,以及模块之间的联系.本节就分析一下 ...

最新文章

  1. iPhone 14 与iPhone 13
  2. 软件隐喻的本质与模式
  3. Windows server 2003 关于DNS的配置以及区域复制测试
  4. 那些年我在CSDN追过的安全白帽师傅,respect
  5. openshift_在OpenShift上扩展Java EE微服务
  6. 红黑树概念及其相关操作的实现
  7. excel图表交互联动_深入讲解EasyShu图表与引用数据动态联动功能
  8. File类的基本操作方法
  9. win7便签backup
  10. 简单通用的Makefile编写例子
  11. js去除字符串头尾空格
  12. LoadRunner基础入门教程
  13. 查看电脑ip地址、查看手机ip地址、根据域名查看ip地址
  14. 麒麟V10系统-系统激活点击按钮无响应
  15. 上次的计网络课你是不是又旷课了
  16. 想不到 HR 都在 GitHub 捞人!五位开源大牛分享成长经历(文末福利)
  17. 大型情感连续剧,从焫鷄到咸鱼
  18. d盘格式化了能正常使用吗
  19. java取模数_java如何用负数做模数计算?
  20. AS问题解决系列3—iCCP: Not recognizing known sRGB profile

热门文章

  1. InstallShield 2015 生成单个EXE包和 MSI包
  2. robocopy file backup script
  3. JavaScript 自执行函数剖析
  4. Eclipse/MyEclipse安装FindBugs
  5. ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
  6. MySQL高级 - InnoDB特性
  7. SpringSecurity的csrf防护措施
  8. 谈谈Spring中都用到了那些设计模式
  9. ViewResolvers
  10. RocketMQ消息支持的模式-OrderProducer(顺序)