Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC编程——路由

ASP.NET MVC编程——路由

作者头像
甜橙很酸
发布于 2018-03-30 02:13:04
发布于 2018-03-30 02:13:04
1.8K00
代码可运行
举报
文章被收录于专栏:DOTNETDOTNET
运行总次数:0
代码可运行

框架自动生成的路由配置

上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RouteConfig
{
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
}

注意:路由中的控制器和操作不区分大小写。

忽略路由

IgnoreRoute为RouteCollection 的扩展方法,作用是忽略指定样式的路由。

上面routes.IgnoreRoute("{resource}.axd/{*pathInfo}");中的{resource}代表一个路由参数,{resource}.axd代表以.axd结尾的字符串;{*pathInfo}也是一个路由参数,*代表匹配任何字符串,那么以pathInfo结尾的串都会匹配到。这条语句完整含义是:以axd结尾的任何字符串,不论斜杠后是何种字符串都不执行路由行为。

映射路由

MapRoute也是RouteCollection 的扩展方法,映射路由。

MapRoute有多个重载的方法,所有的参数含义如下:

参数名称

参数类型

注释

name

string

路由名称

url

string

Url模式

defaults

object

默认路由值对象

constraints

object

一组表达式,限定URL参数值

namespaces

string[]

设置一组命名空间

参数解析

1)defaults设置默认的路由值对象,

2)constraints:通过正则表达式来设置约束条件

如constraints:new {id=@"\d+"}限制id只能是数值类型

规则:从前到后逐段匹配,请求URL参数少于定义的URL时,默认配置补全对应的参数。

几个例子:

routes.MapRoute(

                name:"",

                url:"V1/{controller}/{action}/{id}",

                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },

                constraints:new {id=@"\d+"}

                );

3)url

{controller}/{action}/{id}

这种形式包括了三段,段指的是路由中用/隔开的部分。约定路由中的控制器和操作用controller和action表达。

段也可以包含字面值。

不允许有两个连续的段值:

例如

不允许:{controller}{action}/{id}

合法的:{language}-{current}/{controller}/{action}/{id}

多个路由的选择问题

当配置多个路由时,从上到下依次匹配,直至匹配到一个。

匹配现有文件

通过设置RouteCollection.RouteExistingFiles属性来确定是否可以匹配到现有文件。若,routes.RouteExistingFiles = false;则,禁止匹配到现有文件,只能匹配路由表里的虚拟路由。

例:

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.RouteExistingFiles = true;

            //其他配置

        }

使用特性配置路由

将属性RouteAttribute 标记到控制器或控制器操作上。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]

public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IRouteInfoProvider

使用特性的三个属性或构造函数:

public RouteAttribute(string template):template是路由匹配模式

Name:获取或设置路由名称

Order:获取或设置路由应用顺序

Template:获取路由匹配模式

URL与搜索引擎优化

1)URL越短越好

2)用破折号而不是下划线

3)使用小写字母。根据HTTP规范,URL区分大小写,一般的搜索引擎遵循HTTP规范。

使用Glimpse观察路由

安装Glimpse

地址http://getglimpse.com/Docs/#download找到所需安装命令。在网站上可以看到不只应用于MVC;这里主要是使用这个工具观察路由,所以下载MVC包。

打开VS->工具->NuGet程序包管理器->程序包管理器控制台,在控制台上输入命令:Install-Package Glimpse.MVC5,然后回车,执行安装,结果如下:

启用Glimpse

运行web应用,输入地址格式为:网站根目录/glimpse.axd,例如

http://localhost:51881/glimpse.axd,显示界面如下,点击Turn Glimpse on启动。

使用Glimpse观察

启动了Glimpse以后,输入http://localhost:51881/Home/Contact,看到下图

注意浏览器下方多了一条统计信息,从这里可以看到路由请求的相关信息,以上面输入的地址为例:

浏览器请求耗时

服务端响应耗时

点击下面的图标查看更加详细的信息

展示详细信息的界面如下所示:

从上图中可以看到配置,运行环境,模型绑定,请求,路由,服务器,时间统计等等。

扩展路由-创建自定义路由约束

继承IRouteConstraint接口,实现Match方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomRouteConstraint : IRouteConstraint
{
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            //实现验证

            //验证通过返回true
            return true;
        }
}

使用约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
routes.MapRoute(
                name:"CustomConstr",
                url:"{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints:new {id=new CustomRouteConstraint()}
                );

原理

1)首先,UrlRouteModule处理新请求,将请求URL映射到定义的路由器上。

2)若URL匹配到已定义的路由,那么创建IRouteHandler实例(默认实例为MvcRouteHandler对象)。

3)IRouteHandler返回HTTP处理器实例(默认的为MvcHandler),HTTP处理器实例负责处理请求消息。

4)HTTP处理器实例使用IControllerFactory(控制器工厂)创建对应的控制器对象。

注意:

对于1)如果请求的URL能够匹配到网站根目录下的实体文件,那么不会再匹配虚拟路由,除非通过RouteCollection.RouteExistingFiles来设置改变这一行为。

参考:

1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬

译。ASP.NET MVC4 Web编程

2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译  ASP.NET MVC4 高级编程(第四版)

3.黄保翕,ASP.NET MVC4开发指南

4.蒋金楠,ASP.NET MVC4框架揭秘

5.https://www.asp.net/mvc

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASp.NET MVC 路由「建议收藏」
ASP.NET MVC Route—转发请求: 1.客户端发起请求 2.到达IIS 3.转发到程序集 4.经过一个路由匹配–转发到匹配的控制器中 5.匹配的action去处理
全栈程序员站长
2022/09/15
5370
Asp.Net MVC2.0 Url 路由入门---实例篇
     本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术。
老马
2022/05/10
4360
ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习
  在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor。在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎。
Edison Zhou
2018/08/20
1.9K0
ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习
ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 。MVC是一个架构良好并且易于测试和易于维护的开发模式。基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类。 · Views: 应用程序动态生成 HTML所使用的模板文件。 · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板。 本系列教程,我们将覆盖所有这些概念,并告诉您如何在ASP.NET MVC 5中使用它们来构建应用程序。 首先,让我们创建一个控制器类。在解决方
葡萄城控件
2018/01/10
2.8K0
ASP.NET MVC 5 - 控制器
Asp.net mvc 知多少(二)
本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。 由于个人技术水平和英文水平也是有限的,因此错误在所难免,希
圣杰
2018/01/11
2.2K0
Asp.net mvc 知多少(二)
ASP.NET Web API路由规则(二)
(注:至于为什么用MapHttpRoute而不是MapRoute;为什么用routeTemplate而不是用url我们再以后的章节介绍)
liulun
2022/05/09
5220
ASP.NET Web API路由规则(二)
[译]Asp.net MVC 之 Contorllers(二)
URL路由模块 取代URL重写 路由请求 URL路由模块的内部结构 应用程序路由 URL模式和路由 定义应用程序路由 处理路由 路由处理程序 处理物理文件请求 防止路由定义的URL 属性路由  书接上回[译]Asp.net MVC 之 Contorllers(一) URL 路由HTTP模块通过获取 URL,然后调用合适的执行方法处理进来的请求。URL 路由 HTTP 模块取代了旧版本 ASP.NET 的 URL 重写功能。URL 重写的核心包括获取请求、解析原始 URL 以及指导 HTTP 运行时环境服务于
数据分析
2018/03/01
2K0
[译]Asp.net MVC 之 Contorllers(二)
MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)
   我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等。但是在实际的开发中,随着项目规模的不断扩大,Controller控制器也随之不断增多。如果在Controllers文件夹下面有超过两位数controller,即便采用良好的命名规范,或者用子文件夹的形式区分不同功能的控制器,还是会影响项目的可阅读性和可维护性。因此,在一些场景下,如果能把与某功能相关的文件分离到一个独立的项目中是非常有用的。Asp.Net MVC提供了Areas(区域)的概念达到这一目的。
aehyok
2018/09/11
7880
MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)
ASP.NET MVC5高级编程 ——(5)路由
这章呢,我们开始讲ASP.NET MVC5中的路由机制,在这之前,先提一下URL(Uniform Resource Locator)-- 统一资源定位符。需要注意的是,这里的“资源”这个词,是一个抽象的概念,既可以指一个文件,也可以指一个方法、一个类或是一段代码。由此我们引出了路由的主要用途:
浩Coding
2019/07/03
2.2K0
ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
本篇代码基于上一篇进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2018/10/09
1.2K0
ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
Asp.Net MVC2.0 Url 路由入门
   本篇文章是初识Asp.Net MVC2.0 的后续的介绍。此文将从Routing未开放源代码开始,还会对Asp.Net的Url重写技术做个简单介绍。并简单介绍Asp.Net MVC2.0 Url路由技术的使用。
老马
2022/05/10
9290
ASP.NET MVC 中宿主WCF Rest 服务的解决方法
我这里就是通过routes.MapRoute(参数)中的参数进行处理的。MapRoute的重载如下:
aehyok
2018/09/11
3600
asp.net MVC 应用程序的生命周期
  首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢?       本文我们会详细讨论MVC应用程序一个请求的生命周期,从一个控件到另一个控件是怎样被处理的。我们还会详细介绍一下整个请求的生命周期中,用到的相关组件。因为在平常的开发过程中,我们可能知道怎样去使用MVC框架来处理相关的请求,大部分的时候我们只是在controller和action方法之间做相关的处理,对于真正内在的运行机制可能不是很了解。
用户1172223
2018/01/26
1.9K0
ASP.NET MVC默认配置如有跳转到指定的Area区域中的对应程序中
  今天在搭建一个基于MVC的项目,因为项目涉及到了手机和pc端,为了方便和减少二者之间的耦合我在区域(Areas)中建立了两个 程序空间,那么问题来了我想让程序默认跳转到我所指定的areas中的对应项目怎么做呢?其实理解了路由配置的原理这点其实并不是很难,请看我的代码:
追逐时光者
2022/02/15
5230
ASP.NET MVC默认配置如有跳转到指定的Area区域中的对应程序中
ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试。 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法。 单元测试要满足四个条件:自治的,可重复的,独立的,快速的。 自治的是指:关注于验证某个单一功能,例如只关注于类的某个方法的功能。 可重复的是指:无论何时允许同一段测试代码都应该得到相同的结果。 独立的是指:不依赖与其他任何系统或单元测试。 快速的是指:所有测试都应快速地完成, 集成测试 验证两个或多个组件之间的交互。 验收测试 确保已构建的系统实现了既定的全部功
甜橙很酸
2018/04/17
2.2K0
ASP.NET MVC编程——单元测试
MVC框架介绍
2.(App_Start):包含mvc系统启动的相关类, RouteConfig:路由配置, FilterConfig:过滤器配置
wfaceboss
2019/04/08
1K0
MVC框架介绍
ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了。 我们只要创建简单的资源文件,通过MVC的路由设置就可以轻松的进行语言中的
用户1149182
2018/01/16
1.5K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术。例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务。另外,还有最新的数据库技术、最新的设计模式和技术。 当选择最新的软件技术时,有几个因素在起作用,其中包括如何将这些技术整合起来。过去两年中,我最喜欢的一项技术就是设计单页面应用(SPA)的 AngularJS。作为一个微软stack开发者,我也是使用 ASP.NET MVC 平台实现 MVC 设计模式和并进行研究的粉丝,包括它的捆绑和压缩功能
葡萄城控件
2018/01/10
8.1K0
如何在 ASP.NET MVC 中集成 AngularJS(1)
Attribute Routing With ASP.net MVC 5
Routing 是 ASP.net MVC 将地址映射为 Action 方法的技术。
beginor
2020/08/10
6480
Attribute Routing With ASP.net MVC 5
MVC项目开发中那些用到的知识点(MvcContrib分离ASP.NET MVC项目)
在http://www.cnblogs.com/aehyok/archive/2013/04/07/3006438.html这篇随笔中,我简单的介绍了,asp.net mvc3.0中自带的Areas的使用。本次主要进行扩展,来讲一下,在开发后期项目中用的MvcContrib来对项目进行分离,比如最简单的分离Web项目,前台和后台。
aehyok
2018/09/11
6350
MVC项目开发中那些用到的知识点(MvcContrib分离ASP.NET MVC项目)
相关推荐
ASp.NET MVC 路由「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验