关于路由的理解

为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由。

各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如下: 

使用路由的好处:

能够根据系统需求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)。

屏蔽物理路径,提高系统的安全性,以上情况是无法根据 URL 分析视图文件在站点目录中的位置。

有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变。

 ASP.NET MVC 中的路由

回顾 MVC 的工作过程,加入用户请求如下 URL,则路由的执行过程如图所示:

ASP.NET MVC 默认路由

RouteConfig.cs 中的 URL 规则定义如下:

URL 模式解释:

上面的 URL 中的参数值是:“{controller}/{action}/{id}”,称之为 URL 模式。

该模式是一种字符串,包括一些固定的“字符字面量”和“占位符”,占位符用大括号“{}”表示。

URL 模式规定了 URL 路径的定义规则。

URL 模式的定义

定义语法:

占位符:可以是一个字符串或字符,比如“x”、“id”、“year”等。

字面量:可能是一个比较固定的字符,比较常见的是斜杠“/”;也可以是字符串。示例如下:

特殊规则:不能以斜杠“/”或波浪线“~”字符开头,不能包含“?”,同时占位符也不能连续。示例如下:

URL 模式匹配示例总结:

匹配要求:

1  字面量:必须严格匹配,即实际请求的 URL 中的字符串和路由模式中的字面量字符串必须完全一致。

2  大小写:URL 模式匹配是不区分大小写。

3  常量:没有包含在大括号内的信息被作为一个常量对待;比如上面的 Course,以及在分区项目中路由的定义

Admin/{controller}/{action}/{id}  这是分期路由的定义

URL 模式匹配原理分析

URL 模式匹配原理图解:

定义多个路由

routes.MapRoute()定义路由的要求如下:

string[] namespaces 这个命名空间 在分区的时候用到

可以通过不同的路由名称定义多组路由。

定义多个路由的方法,参考如下代码:

路由的匹配原则:如果一个 URL 能够在多个路由中匹配,则默认使用第一个匹配的路由。

UrlPrameter.Optional 的参数作用是什么?该参数可以作为路由参数的默认值,当需要让“/Home/Index” 或“/Home”能正常匹配,但又不希望赋一个无意义的值,可以使用该参数。

路由匹配总结:

关于{controller}/{action} 

必不可少:在一个实际的 MVC 系统中, {controller}和{action} 必不可少,如果缺少就会找不到路径而出错。

约定规则:这个占位符是 MVC 里面约定的,并且会被解析成控制器和对应的方法。

位置灵活:这两个约定的占位符可以在任意位置。

其他占位符

仅仅占位:其他占位符只起到占位而已,比如{aa}/{bb}/{cc}是不能把 aa 解析成控制器,bb 解析成动作方法。默认要求:一个路由中,如果没有规定{controller}和{action},或者只是规定其中之一,则没有规定的部分都将使用默认值。

如果你在路由里面没有写Controller 和 action 那么你在默认值里 一定要配

匹配顺序 

优先使用:多个路由匹配一个 URL,则优先匹配的会使用。

尽量避免:定义多个路由时,尽量避免出现多匹配。

路由数据、特殊匹配、默认值与约束

路由数据的存储和映射

数据存储方法:在 ASP.NET MVC 路由系统中,RouteData 对象用来保存 URL 模式和实际 URL 匹配产生的路由数据。

数据存储格式:路由数据保存方式为:“键-值”对,RouteData 是视图基类和控制器基类的属性。

路由和控制器的映射:{controller} 和{action} 在程序运行中的映射如图所示:

\

使用路由数据

RouteData.Values 介绍:

1  是 RouteValueDictionary 类型,使用方式和 Dictionary<TKey, TValue>类似。

2  RouteData 定义为视图和控制器基类的属性。

3  在视图中可以遍历 RouteDate.Values,来输出路由匹配产生的路由数据。

路由数据的获取方法测试如下:

特殊 URL 匹配规则

*匹配:用*来匹配 URL 剩余部分,示例代码如下:

贪婪匹配规则,示例代码如下:

路由默认值

再次强调 defaults 参数的作用,如下示例所示:

默认值不提供的必须通过 URL 提供,示例如下:

只提供中间参数的默认值不起作用,如下图:

 

包含“字面量”时默认值不起作用,如下图:

路由约束

(1)路由约束的引出:某 Blog 系统,定义 URL 模式 ,可根据 URL 中的“年月日”数据读取文章?

(2)分析:定义 URL 模式为{year}/{month}/{day},如何避免无意义的 URL?

解决方案:使用正则表达式,示例如下:

 

通过路由生成 URL

视图中的链接

(1)链接的两种方式:纯静态链接:直接指向链接地址,一般不需要改变。动态链接:为了更好的保证 web 项目移植的时候路径的正确。

(2)Url.Content()方法的不足:当路由规则变化是,需要修改所有路径。示例如下:

使用 Action()生成链接 

(1)Url.Action()方法定义如下:

(1)示例:URL 模式为 stumanage/{controller}/{action}/{id}

使用 ActionLink()生成链接 

(1)Html.ActionLink()方法定义如下:

(2)示例:URL 模式为 {controller}/{action}/{id}

分区项目

分区项目简介

(1)分区项目的作用:解决 Controller 和 View 太多的问题,能够让系统模块划分更清晰,便于管理

 (2)创建方法:添加-区域 打开添加区域对话框,输入区域名称

不同分区项目相同控制器的解决方法 

(1)主项目和分区项目有相同的控制器,程序运行会出现错误,如下所示:

解决方法:分别给分区项目和主项目的路由添加命名空间。示例如下:

这时候上文说的namespaces就派上用场了.

将两边的路由都加上 各自的命名空间

到此,路由的讲解 也就玩了.

asp.net Mvc 路由详解,非常详细.的更多相关文章

  1. ASP.NET MVC Route详解

    在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...

  2. Asp.Net Mvc 控制器详解

    理解控制器 控制器的角色 (1)中转作用:控制器通过前面的学习大家应该知道它是一个承上启下的作用,根据用户输入,执行响应行为(动 作方法),同时在行为中调用模型的业务逻辑,返回给用户结果(视图). ( ...

  3. asp.net MVC ViewData详解

    转自:http://www.cnblogs.com/gaopin/archive/2012/11/13/2767515.html 控制器向视图中传值ViewData详解 1.将一个字符串传值到视图中 ...

  4. ASP.NET MVC 过滤器详解

    http://www.fwqtg.net/asp-net-mvc-%E8%BF%87%E6%BB%A4%E5%99%A8%E8%AF%A6%E8%A7%A3.html 我经历了过滤器的苦难,我想到了还 ...

  5. MVC MVC 路由详解

    在项目中我们引用了System.Web.Routing;   Routing的作用: 确定Controller 确定Action 确定其他参数 根据识别出来的数据, 将请求传递给Controller和 ...

  6. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  7. ASP.NET生命周期详解

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  8. ASP.NET生命周期详解 [转]

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  9. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. PAT-1058 A+B in Hogwarts (进制转换)

    1058. A+B in Hogwarts If you are a fan of Harry Potter, you would know the world of magic has its ow ...

  2. 模板技术:JSP、Thymeleaf之间的比较学习

    JSP Thymeleaf 可以写java代码的html JSP的替代品 执行过程   页面元素   include   跳转   cookie   session   作用域   隐式对象   JS ...

  3. celery异步消息队列的使用

    1.准备工作 1.1 流程图 2.环境安装 2.1.在Ubuntu中需要安装redis 安装redis $sudo apt-get update $sudo apt-get install redis ...

  4. SpringMVC入门总结

    一.SpringMVC的好处? 1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式 2,能与spring其它技术整合比如说webflow等, 3,获取request及s ...

  5. ES[7.6.x]学习笔记(十二)高亮 和 搜索建议

    ES当中大部分的内容都已经学习完了,今天呢算是对前面内容的查漏补缺,把ES中非常实用的功能整理一下,在以后的项目开发中,这些功能肯定是对你的项目加分的,我们来看看吧. 高亮 高亮在搜索功能中是十分重要 ...

  6. MySQL死锁系列-常见加锁场景分析

    在上一篇文章<锁的类型以及加锁原理>主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能 ...

  7. Thunar左侧边栏不完全显示PLACES的解决

    场景 我的笔记本装上系统时用的英文,安装中文之后,发现文件管理器的默认的几个文件夹 Desktop.Music.Videos.Downloads等都变成了中文,由于是新安装的系统,就重新生成 loca ...

  8. Linux显示行号设置

    linux显示行号设置 第一步,打开vim vi ~/.vimrc 第二步,在该文件中加入一行,命令如下: set nu # 显示行号 set nonu # 不显示行号 微信公众号:喵哥解说 公众号介 ...

  9. 【MOOC操作系统】测试题大题-进程调度 先入先服务算法例题 【某多道程序系统供用户使用的主存为100K,磁带机2台,打印机1台,采用可变分区存储管理,静态方式分配外围设备(进程获得所需全部设备才能进入内容),忽略用户作业的I/O时间。采用动态分区、首次匹配法(从低地址区开始)分配主存,一个作业创建一个进程,且运行中不紧缩内存。作业调度采用FCFS算法,在主存中的进程采用剩余时间最短调度算法。】

    分析图: 答案: (1) 8 : 00作业1到达,占有资源并调入主存运行. 8: 20作业2和3同时到达,但作业2因分不到打印机,只能在后备队列等待.作业3资源满足,可进主存运行,并与作业1平分CPU ...

  10. Unable to start services. See log file /tmp/vmware-root/vmware-6853.log for details.

    debian安装vmware错误 https://github.com/AdministratorGithub/vmshell vm15.1.0解决linux安装出现Unable to start s ...