1.前期准备

  新建一个MVC项目,并添加Home和About两个控制器

  在这两个控制器对应添加index页面

  1. namespace Study_MVC_Route.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5. // GET: Home
  6. public ActionResult Index()
  7. {
  8. return View();
  9. }
  10. public string Regex(int year,int month,int day)
  11. {
  12. return $"{year}-{month}-{day}";
           //$是在字符串中内嵌参数
  13. }
  14. }
  15. }
  1. namespace Study_MVC_Route.Controllers
  2. {
  3. public class AboutController : Controller
  4. {
  5. // GET: About
  6. public ActionResult Index()
  7. {
  8. return View();
  9. }
  10. }
  11. }

2.添加路由

  在APP_Start文件夹下面的RouteConfig.cs,是MVC的路由配置文件

  主要属性如下:

  1. name 路由名称
  2. url url匹配的正则表达式,用{}表示一个参数变量,可以为空;无{}则是一个硬性的匹配要求
  3. defaults 默认,匹配上url后,若url参数为空,则使用默认动作 controller = 默认控制器, action = 默认动作, id = 参数
     constraints: url参数约束
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Routing;
  7.  
  8. namespace Study_MVC_Route
  9. {
  10. public class RouteConfig
  11. {
  12. public static void RegisterRoutes(RouteCollection routes)//路由集,由上往下匹配路由
  13. {
  14. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略路由
  15. //--------------------------------添加路由------------------------------------------
  16. //以Test开始的url
    //url没有引入controller参数,所以controller使用默认值,若不给参数赋值,也使用默认值
  1. routes.MapRoute(
  2. name: "Test",
  3. url: "Test/{action}/{id}",
  4. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  5. );
  6.  
  7.        
  8. //Route的书写可以省略命名参数,即name、url、defaults这些命名参数可以省略,如下
  9. //url为About可以访问Home/Index
  10. routes.MapRoute("About1", "About", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
  11. //url为About访问About/Index
  12. routes.MapRoute("About2", "{controller}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
  1.        //加大括号表示参数,不加则为一个普通字符串链接,是一个硬性的匹配要求
  1.  
  2.        //传参对比
  3. //使用constraints做参数约束
  4. //home/Regex_2014_05_19
  5. routes.MapRoute(
  6. name: "Regex",
  7. url: "{controller}/{action}_{year}_{month}_{day}",
  8. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
  9. constraints: new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}" }// @"\d{4}"表示输入四位数字,@表取消\的转译效果
  10. );
  11.        //普通传参
  12. //home/Regex?year=2014&month=05&day=19
  13. routes.MapRoute(
  14. name: "Default",
  15. url: "{controller}/{action}/{id}",
  16. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  17. );
  18. }
  19. }
  20. }

3.扩展

  使用一个路由扩展类对浏览器进行判断

  1. public class AgentRoute : RouteBase
  2. {
  3. public override RouteData GetRouteData(HttpContextBase httpContext)
  4. {
  5. if(httpContext.Request.UserAgent.IndexOf("Edge/12.10240") >-)//判断是否使用了Edge浏览器
  6. {
  7. RouteData routeData = new RouteData(this,new MvcRouteHandler());
  8. routeData.Values.Add("controller", "Edge");
  9. routeData.Values.Add("action", "Index");
  10. return routeData;
  11. }
  12. else
  13. {
  14. return null;
  15. }
  16. }
  17.  
  18. public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
  19. {
  20. return null;
  21. }
  22. }

  在RouteConfig中添加这个类的实例(也就是添加一个路由规则)

  1.   routes.Add(new AgentRoute());//这行代码放在不同的路由下面有不同的效果

  比如:

  1、放在最前面

  这样在进行其他路由判断之前,会先进行这个判断,即每次访问url都会先判断是否是Edge浏览器

  若是,命中路由

  若不是,return null ;继续往下判断

  2、要是将其放在路由Test后面

  那Edge也可以访问  Test/{action}/{id}   这个规则的url,因为这个路由规则会先被命中

  效果展示:

  Chrome浏览器,正常访问

  Edge浏览器,会访问Edge/Index页面,因为它命中了AgentRoute

MVC_Route层层深入的更多相关文章

  1. 拥抱基于jquery.deferred的ajax,和层层嵌套回调的ajax说拜拜

    前言 在项目中,无论是维护自己的代码,还是重构他人的项目代码,看到层层嵌套,异常冗余的某个function,那时我们的内心肯定是奔溃的! 在jquery1.5版本之前,如果我们某个操作需要多个ajax ...

  2. 层层递进Struts1(七)详解DispatchAction

    通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的Dispatch ...

  3. 层层递进Struts1(八)之总结

    先来看一下Struts1学习总结的思维导图,画的主要是Struts1中的重点和博客分布,如下所示: 系列博客的侧重点是: Struts1是什么? 为什么要使用它? 如何使用Struts1? Strut ...

  4. 层层递进Struts1(六)自定义转换器

    Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例: org.apache.catalina.core.StandardWrapperValve invo ...

  5. Hadoop化繁为简(二)—层层递进轻松入门hdfs

    层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...

  6. 关于Promise层层嵌套可读性差问题

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象 ES6 规 ...

  7. 【XAF问题】层层分级,如何让按钮显示指定的视图

    一.问题 1. 层层分级,如何让按钮显示指定的视图 二.解决方法 解决方法:因为它是层层级别的,不能显示出来指定的视图,需要添加ActionContainer,才可以显示出来

  8. 层层递进Struts1(三)之Struts组成

    这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤:获取路径.封装表单.获取转向列表.转向逻辑处理.转向,与此对应的是:ActionServlet.Act ...

  9. 层层递进Struts1(五)之处理流程

    这篇博客我们深入Struts框架执行部分源码,从ActionServlet的process函数开始,看一下其内在的执行过程. 流程图 以下流程图展示的是ActionServlet和RequestPro ...

随机推荐

  1. Appium的图像界面浅说

    appium的图形用户界面(GUI) (1)Application中各个项的含义作用: Application Path:填写你需要测试的Android APK的包地址(两种方式:1直接点击Choos ...

  2. display详解

    css中的display属性 display属性是我们在前端开发中常常使用的一个属性,其中,最常见的有: none block inline inline-block inherit 下面,我将按照顺 ...

  3. mysql执行update报错 Err] 1055 - 'information_schema.PROFILING.SEQ' isn't in GROUP BY

    mysql执行update报错 Err] 1055 - 'information_schema.PROFILING.SEQ' isn't in GROUP BY 今天开发的同事发来如下错误信息,最最简 ...

  4. 简单的jvm优化的尝试

    一.eclipse 启动优化 在日常的开发中发现eclipse 启动的时候非常慢,并且在实际的开发中也非常卡,所以尝试着优化一下.现在eclipse 是运行在jdk1.7上. 首先我们可以看到ecli ...

  5. 解决gitk显示文件内容中文乱码

    解决gitk显示文件内容中文乱码 1.git config 命令 设置git gui的界面编码 git config --global gui.encoding utf-8 2.修改配置文件 在~\e ...

  6. jmeter元件执行顺序及简介

    最近在学习Jmeter,在进行实操之前,先查看了官方文档.因为官方文档是英文的,为了方便以后查看,自己翻译了一部分,中间个别地方根据自己的理解简单地翻译了部分.如果翻译等有问题,欢迎指正. 一.执行顺 ...

  7. vue实现筛选功能,文字选中变色

    <template> <Poptip trigger="hover" title="Title" content="content& ...

  8. Hbase记录-HBase性能优化指南

    垃圾回收优化当region服务器处理大量的写入负载时,繁重的任务会迫使JRE默认的内存分配策略无法保证程序的稳定性 所以我们可能需要对region服务器的垃圾回收机制进行一些参数调整(因为master ...

  9. Web API中给领域模型添加媒体类型支持

    一.媒体类型 媒体类型(也称为MIME类型)标识一段数据的格式.在HTTP中,媒体类型描述了消息体的格式.媒体类型由两个字符串组成,一个类型和一个子类型.例如:text / html: image/ ...

  10. Web项目发布的一些设置

    比如我们有个项目想要发布到互联网上,我们首先需要购买域名以及主机,主机的话,推荐云主机(本人推荐西部数码或者阿里云),性能好: 我们先在云主机上搭建环境,比如Mysql,Jdk,Tomcat: 然后我 ...