1.前期准备

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

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

namespace Study_MVC_Route.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
public string Regex(int year,int month,int day)
{
return $"{year}-{month}-{day}";
       //$是在字符串中内嵌参数
}
}
}
namespace Study_MVC_Route.Controllers
{
public class AboutController : Controller
{
// GET: About
public ActionResult Index()
{
return View();
}
}
}

2.添加路由

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

  主要属性如下:

  name: 路由名称
url: 和url匹配的正则表达式,用{}表示一个参数变量,可以为空;无{}则是一个硬性的匹配要求
defaults: 默认,匹配上url后,若url参数为空,则使用默认动作 controller = 默认控制器, action = 默认动作, id = 参数
 constraints: url参数约束
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace Study_MVC_Route
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)//路由集,由上往下匹配路由
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略路由
//--------------------------------添加路由------------------------------------------
//以Test开始的url
//url没有引入controller参数,所以controller使用默认值,若不给参数赋值,也使用默认值
            routes.MapRoute(
name: "Test",
url: "Test/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);        
//Route的书写可以省略命名参数,即name、url、defaults这些命名参数可以省略,如下
//url为About可以访问Home/Index
routes.MapRoute("About1", "About", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
//url为About访问About/Index
routes.MapRoute("About2", "{controller}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
       //加大括号表示参数,不加则为一个普通字符串链接,是一个硬性的匹配要求

       //传参对比
//使用constraints做参数约束
//home/Regex_2014_05_19
routes.MapRoute(
name: "Regex",
url: "{controller}/{action}_{year}_{month}_{day}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}" }// @"\d{4}"表示输入四位数字,@表取消\的转译效果
);
       //普通传参
//home/Regex?year=2014&month=05&day=19
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}

3.扩展

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

    public class AgentRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
if(httpContext.Request.UserAgent.IndexOf("Edge/12.10240") >-)//判断是否使用了Edge浏览器
{
RouteData routeData = new RouteData(this,new MvcRouteHandler());
routeData.Values.Add("controller", "Edge");
routeData.Values.Add("action", "Index");
return routeData;
}
else
{
return null;
}
} public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}

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

  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. OmniPlan,一款让你无法自拔的项目管理工具(仅适用于MAC系统)

      OmniPlan 大家都知道Windows系统可以使用project来方便的管理跟踪项目的各项任务,那么Mac系统有没有这样专业级的项目管理软件了?答案是有,今天给大家推荐的Mac系统下的项目管理 ...

  2. 安卓和java开发环境的安装

    java配置安卓需要,sdk,jdk(java),adt,eclipse 对于jdk的配置和安装: 1 卸载原来的jdk,重新配置环境变量只需要:在系统变量中把新的jdkJ安装路径写到“JAVA_HO ...

  3. HDU 1003 Max Sum 求区间最大值 (尺取法)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  4. HDU 1880 魔咒词典 (Hash)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. python赋值和生成器

    在python赋值过程中,对单个变量的赋值,在所有语言中都是通用的,如果是对两个变量同时进行赋值,这个时候,就会出现一点点小的差异.例如在下面的一两行代码中. a , b = b , a+b 这是同时 ...

  6. springcloud实战案例苏宁和海信

    http://springcloud.cn/view/341 为什么springlcoud不选用zookeeper: http://www.infoq.com/cn/articles/why-does ...

  7. grub.conf解析

    一.grub简介系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化 ...

  8. CodeForces160D 最小生成树 + dfs

    https://cn.vjudge.net/problem/26727/origin 题目大意: 给一个带权的无向图,保证没有自环和重边. 由于最小生成树不唯一,因此你需要确定每一条边是以下三种情况哪 ...

  9. Java多线程常用面试题(含答案,精心总结整理)

    现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 目的是检测你对”join”方法是否熟悉.这个多线程问题比较简单,可以用join方法实现. 核心: threa ...

  10. Zookeeper+Kafka完全分布式实战部署

    Zookeeper+Kafka完全分布式实战部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实我之前部署过kafak和zookeeper的完全分布式,集群是可以正常使用没错, ...