ASP.NET MVC的生命周期与网址路由

网址路由(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”就会对比失败。

转载于:https://www.cnblogs.com/zgqys1980/archive/2012/08/16/2641941.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中SQLiteDatabase操作【附源码】

像我们做的很多应用程序及网站一样,基本都是对数据库进行增删改查来实现相应的功能。那么Android开发也一样,不过由于在移动客户端应用,所以不会像sql server、mysql那么复杂,Android应用程序支持本地数据库,SQLiteDat…

【BEV感知算法概述——下一代自动驾驶感知算法】

文章目录 BEV感知算法概念BEV感知算法数据集介绍BEV感知算法分类BEV感知算法的优劣小结 BEV感知算法概念 Bird’s-Eye-View,鸟瞰图(俯视图)。BEV感知算法存在许多的优势。 首先,BEV视图存在遮挡小的优点,由于视觉的透…

博客园CodingLife模板样式优化

博客园CodingLife模板样式优化,小屏和大屏均做了优化,感兴趣的园友可以复制到你的页面定制CSS代码中, 源码地址:http://www.cnblogs.com/blog/customcss/334547.css 更多专业前端知识,请上 【猿2048】www.mk2048.com

WPF控件和布局

WPF控件和布局,根据刘铁猛《深入浅出WPF》书籍讲解内容,主要记录控件和布局的原理,如果有不足的地方,请大牛们键盘下留情--轻喷!如果还算有用,请给点动力,支持一把! 一、WPF里的控件…

Oracle ——概述 Oracle 5 步调优方法论

http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/OPS3/Default.aspx 对 Oracle 调优应该采取积极的态度。如果等到用户开始抱怨性能,才调优通常以为时已晚,即便是最有效的调优策略。性能问题确定和处理的时间越晚&#x…

整体服务器与微服务

介绍 刚开始时,由于要求简单,所以应用程序既简单又小。 随着时间要求和需求的增长,我们的应用程序变得越来越大,越来越复杂。 这导致将单片服务器开发和部署为一个单元。 在某种程度上,微服务可以通过简单的应用程序回…

NEXUS S安卓4.0/4.1 【完美】 ROOT教程

原文链接:http://bbs.gfan.com/android-3517082-1-1.html 进行bootloader解锁(即使解锁,再上锁),会清除你手机上的【所有】数据(包括内部的16G SD 存储),包括但不限于应用、设置、联…

HDU 2647 Reward 拓扑排序

http://acm.hdu.edu.cn/showproblem.php?pid2647 题意: 输入N和M代表N个人和M组数据,M组数据中的A和B代表A的工资要比B的工资高,底薪是(888元),问你这个老板至少要付 多少钱给这些员工,A比B工资…

提高Java的锁性能

Plumbr是唯一通过解释应用程序性能数据来自动检测Java性能问题的根本原因的解决方案。 几个月前,我们在Plumbr中引入了锁定线程检测之后,我们开始收到类似于“嘿,太好了,现在我知道是什么导致了性能问题,但是现在应该…

[置顶] UDP协议---心德(1)

UDP协议1.面向无连接 2.速度快 3.不可靠的协议,容易丢包 4.包小于64k DatagramSocket:此类表示用来发送和接收数据报包的套接字 DatagramPacket:数据包 发送端: 1.创建一个udpsocket服务 DatagrameSocket dsnew DatagramSocket(); 2.将数据封装到数据包…

非捕获Lambda的实例

大约一个月前,我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 。 目前,我正在研究有关默认方法的文章,令我惊讶的是,我又回到了Java处理lambda表达式的方式。 这两个功能的交集可能会产生微妙但令人惊讶的效果&#xff0…

SQL Server 查询性能优化——创建索引原则(一)

索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少…

WordPress强制跳转https教程

在互联网火热的今天,安全问题显得越来越重要,为了用户信息安全,很多热门网站都启用了https 有小伙伴就问:我启用了https,为什么访问的时候显示的还是http呢? 其实,有时候并不是因为我们ssl证书…

Java 8的装饰器模式

在最近的一篇文章中,我描述了装饰器模式如何拯救了我的一天。 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法。 这里是: 用Java 8装饰 HyperlinkListener listener this::changeHtmlViewBa…

WPF中使用流文档灵活地显示内容

WPF中使用流文档灵活地显示内容 by: Markus Egger form: http://msdn.microsoft.com/msdnmag/issues/07/08/wpf/default.aspx?loczh Windows Presentation Foundation (WPF) 提供了一系列功能。事实上,功能…

canvas图表(4) - 散点图

原文地址:canvas图表(4) - 散点图 今天开始完成散点图,做完这一节,我的canvas图表系列就算是完成了,毕竟平时最频繁用到的就是这几类图表了:柱状,折线,饼图,散点。经过编写canvas图表…

词频统计工程相关

&#xff08;the format of this article is from SkYjoKEr&#xff09; //开始干之前 模块1、WordClass 一个存放单词以及实现相关操作的类&#xff0c;其中单词以二元组<word, freq>的形式存储。 &#xff08;20min&#xff09; 2、WordCounter 完成单词统计&#xff0…

canvas图形编辑器

原文地址&#xff1a;http://jeffzhong.space/2017/11/02/drawboard/   使用canvas进行开发项目&#xff0c;我们离不开各种线段&#xff0c;曲线&#xff0c;图形&#xff0c;但每次都必须用代码一步一步去实现&#xff0c;显得非常麻烦。有没有一种类似于PS&#xff0c;CAD…

Sacrilege –自定义SWT滚动条

SWT是本机OS小部件之上的薄抽象层。 如果您打算将应用程序与OS外观很好地集成在一起&#xff0c;那将是一件非常好的事情。 但是&#xff0c;作为一种折衷方案&#xff0c;这种方法大大限制了样式功能。 特别是&#xff0c;我感觉到本机SW​​T滚动条通常会干扰更精细的视图布…

CSS3盒模型温故

CSS有一种基础设计模式叫盒模型&#xff0c;定义了Web页面中的元素是如何看做盒子来解析的。每一个盒子有不同的展示界面&#xff0c;下面就来介绍盒模型&#xff0c;主要有一下几种盒模型&#xff1a;inline、inline-block、block、table、absolute position、float。浏览器把…