网址路由(Routing)在ASP.NET MVC中有两个主要用途,一个用途是匹配通过浏览器传来的HTTP请求,另一个用途则是将适当的网址返回浏览器。

首先我们来看下第一个用途,也就是匹配通过浏览器传来的HTTP请求。

客户端对ASP.NET网站发出请求时,能够通过Routing找到合适的HttpHandler来处理网页,大致的处理流程为:

图一 客户端对ASP.NET 网站发出请求的流程

如果HttpHandler是由MvcHandler来处理的,那么,此时就会进入ASP.NET MVC的执行生命周期,并且会找到适当的Controller与Action来对其进行处理,并将信息反馈到客户端。

其次是将适当的网址返回浏览器。

网址路由的另一个用途是决定ASP.NET MVC应该输出什么样的网址并将其返回给浏览器,一般来说,跳转地址或者在View中显示超链接时,都需要参考网址路由的定义,因为这样才能动态决定ASP.NET MVC输出的网址应该是什么。我们接下来看个例子,假如首先默认网址路由。

Public static void RegisterRoutes(RouteCollection routes)
{routes.IgnoreRoute(“{resource}.axd/{*pathInfo} ”);routes.MapRoute( “Default”,“{controller}/{action}/{id}”,new {controller =”home”,action =”Index”,id =UrlParameter.Optional
}
);}
protected  void  Application_Start()
{AreaRegistration.RegisterAllAreas();RegisterRoutes(RouteTable.Routes);
}

在这里我们定义了如下两个默认的网址路由:

  1. IgnoreRoute

    设定*.axd等格式的网址路径不通过ASP.NET MVC执行。例如,ASP.NET内置的Trace.axd文件或其他默认的HttpHandler对象都不通过ASP.NET MVC进行处理。

  2. MapRoute

    MapRoute()方法是定义ASP.NET MVC网址路由最主要的方式,每一个路由都定义了以下3个参数:

    • 路由名称。
    • 对网址路径如何对应到控制器、动作与路由值的设定。
    • 控制器、动作和其他路由值的默认值。

通过这个默认的MapRoute()方法可以得知,在浏览器的地址栏输入“http://localhost/Home/About”时,通过Routing的对应,由于网址路径的一部分为“Home/About”,所以会对应出“{controller}”为“Home”,“{action}”为“About”。因此,ASP.NET MVC会先进入“Controllers”目录,找到Home控制器(也就是HomeController.cs文件),然后再找到这个控制器内的About公开方法啊(Public Method)。这个公开方法就是MVC的Action,也就是实际执行网页主要程序的入口。

当我们在浏览器的地址栏中输入“http://localhost”来访问网站首页时,通过Routing的对应,由于网址路径部分没有任何内容,所以会使用MapRoute()方法的第三个参数所设定的默认值来代替。因此,会先进入“Controllers”目录,找到Home控制器,然后再找到Index公开方法,并进一步执行ASP.NET MVC的所有过程。

由于我们默认定义了两个网址路由,按照ASP.NET Routing的规则,当HTTP提出请求后,URL会进行网址路由的对比,而且是由上而下地一条一条匹配,直到符合HTTP请求的网址为止。

1、例如:http://localhost/Trace.axd/a/b/c/d/e

匹配的顺序

(1) 匹配 routes.IgnoreRoute命名空间的“{resource}.axd/{*pathInfo} ”网址格式。

(2) {resource}.axd匹配到“Trace.axd”,因此继续匹配下一个RouteValue表达式。

(3) 匹配“{*pathInfo}”,得到“a/b/c/d/e”。

(4) 因为所有的RouteValue表达式都匹配成功,所有该HTTP请求会由此网址路由提供服务。

匹配结果

该网址使用routes.IgnoreRoute命名空间进行处理,也就是说,ASP.NET MVC为忽略此请求,改以ASP.NET 架构本身继续处理。

2、例如:http://localhost/Member/Detail?id=123

匹配的顺序

(1) 匹配routes.IgnoreRoute命名空间的“{resource}.axd/{*pathInfo} ”网址格式。

(2) 匹配请求的URL的第1个部分,即“Member”,由于没有匹配到“{resource}.axd”,所以匹配失败。

(3) 跳转到routes.MapRoute命名空间的“{controller}/{action}/{id}”网址格式。

(4) 匹配请求的URL的第1个部分,即“Member”,并且匹配到{controller}参数。

(5) 匹配请求的URL的第2个部分,即“Detail”,并且匹配到{ action }参数。

(6) 接下来的“?id=123”就不算是网址的一部分了,所以它不会被算进到RouteValue表达式中,因此不会再对它进行匹配。

(7) “{id}”部分因为没有匹配到,所以会读取默认值,也就是“UrlParameter.Optional”部分。由于存在默认值,所以也算匹配成功。

(8) 因为所有的RouteValue表达式都匹配成功,所以这次的HTTP请求会由此网址路由提供服务。

匹配结果

该网址使用routes.MapRoute命名空间进行处理,并通过MvcHandler将值赋予适当的Controller和Action程序。在这里会对应MemberController的Detail动作。

为网址路由加上限制条件:

MapRoute()是最常用来定义Routing规则的辅助方法,它其实还有许多应用方式(重载)。最常见的应用方式为“样式比对规则(正则表达式)+限制条件”,下面举例说明:
 routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Guestbook", action = "Index", id = UrlParameter.Optional }, // 参数默认值
                new { id = @"\d+" }
            );

我们在辅助方法中设置了第四个参数,这些参数指定了一个匿名对象,其中ID属性就是我们对比{id}路由值的限制条件,其限制条件使用正则表达式来表示,“\d+”表示路由值必须为

数字的时候才算比对成功,比如你的网址“http://localhost/Order/Member/Index/123abc”就会对比失败。

ASP.NET MVC的生命周期与网址路由相关推荐

  1. ASP.NET 应用程序生命周期概述

    本主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程序生命周期的代码.在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它处理请求,必须执行一些处理步骤.此 ...

  2. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期

    本文内容 应用程序生命周期概述 生命周期事件和 Global.asax 文件 编译生命周期 HTTP 模块 本文概述 VS 2008 ASP.NET 应用程序的生命周期,列出了重要的生命周期事件,并描 ...

  3. 【转】Asp.net页面的生命周期

    介绍 Asp.net是微软.Net战略的一个组成部分.它相对以前的Asp有了很大的发展,引入了许多的新机制.本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好.更灵活地操 ...

  4. IIS 7.0的ASP.NET应用程序生命周期概述

    小结于:http://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx IIS 7.0的ASP.NET应用程序生命周期概述 (一)结构概 ...

  5. ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态. ...

  6. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

    http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspx 在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它 ...

  7. IIS 7.0 的 ASP.NET 应用程序生命周期概述

    本主题介绍在 IIS 7.0 集成模式下运行以及与 .NET Framework 3.0 或更高版本一起运行的 ASP.NET 应用程序的应用程序生命周期.IIS 7.0 还支持经典模式,其行为类似于 ...

  8. Asp.net 2.0生命周期

    Asp.net 2.0生命周期可以分为Web Page.Server Control和 Application 生命周期:     一.Web Page Life Cycle     如果 @ Pag ...

  9. Spring mvc 的生命周期

    今天是第一次接触Spring mvc 首先 我们先从Spring mvc的生命周期来了解它. 首先,浏览器会发送请求,我们的项目通过spring中的一个叫做dispatcherServlet名字的一个 ...

最新文章

  1. 解决无扬声器(无喇叭)的HDMI接口显示屏声音问题
  2. 北京对无人车的热情,华尔街都感受到了
  3. [转帖]linux下的X server:linux图形界面原理
  4. 2.2tensorflow2官方demo
  5. 2019/01/29-Linux常用指令
  6. logback 常用配置详解appender
  7. 爱库存:已实名举报唯品会不正当竞争行为
  8. jmeter 通过ant集成到jenkins
  9. Adobe Flex Application LifeCycle
  10. php round函数输出不对_PHP第一章-变量
  11. python编写窗口怎么清除内容_如何删除或销毁tkinter中的标签?
  12. iSCSI网络存储之IPSAN
  13. STM32USB虚拟串口驱动 支持win10下载
  14. MLA与APA二种文件格式的文献引用写作技巧
  15. bat 命令返回结果_bat教程[283] zip压缩
  16. 天池龙珠训练营Python_Task2: 数据结构_(4)字典
  17. Angular在页面加载很慢的时候,会出现双花括号的问题
  18. Python random模块(获取随机数)常用方法和使用例子
  19. 计算机计算资产分析表,财务指标计算公式excel,用EXCEL做财务指标分析,如何使用其他工作簿做公式计算??...
  20. 【数据分析】:搭建数据分析业务工作流程

热门文章

  1. Zookeeper常用命令操作,javaAPI操作之Curator框架 API
  2. ListView实现倒序显示
  3. toString()和强制类型转换(String)的用法
  4. Laravel-5.1 ---- 将mews captcha整合到项目中!
  5. vb.net 文本框为空提示,一键清空文本框所有内容
  6. gdb core调试
  7. UOJ #592. 投放点的选择
  8. 设置主机名 centos redhad7
  9. BZOJ 3997 [TJOI2015]组合数学(单调DP)
  10. 2017《面向对象程序设计》作业四