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,一经查实,立即删除!

相关文章

ecshop分页类assign_pager分析和扩展

ecshop分页类assign_pager分析和扩展,我们前面的文章中介绍过ecshop ajax分页,他的基础都是简单单一的分页。如果我们要在ecshop分页里面传入自己的参数,你就必须对ecshop的assign_pager分页函数进行系统的认识和分析。 首先我们看category.php的ecshop分…

NEC css规范

CSS规范 - 分类方法 SS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类。 我们按照CSS的性质和用途,将CSS文件分成“公共型样式”、“特殊型样式”、“皮肤型样式”&#…

JDK 8中的流驱动的集合功能

这篇文章介绍了JDK 8的应用–引入了带有集合的 流 ,以更简洁地完成通常需要的与集合相关的功能。 在此过程中,将演示并简要说明使用Java Streams的几个关键方面。 请注意,尽管JDK 8 Streams通过并行化支持提供了潜在的性能优势,但…

知识汇集

Oracle中锁介绍:http://space.itpub.net/26961876/viewspace-731300转载于:https://www.cnblogs.com/yaohonv/archive/2012/08/18/tech-col.html

jquery mobile 移动web(5)

有序列表   <div data-role"content">     <ol data-role"listview" data-theme"g">       <li><a href"#"> List 1</a></li>       <li><a href"#"> L…

cjmx:JConsole的命令行版本

当监视正在运行的Java应用程序时&#xff0c;JConsole是一个很好的工具。 但是&#xff0c;当无法使用JConsole直接连接到JVM&#xff08;例如&#xff0c;由于网络限制&#xff09;并且无法进行SSH隧道传输时&#xff0c;那么拥有命令行版本的JConsole会很棒。 jcmx是JConsol…

Android中SQLiteDatabase操作【附源码】

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

移动设备HTML5页面布局

在HTML5标准添加的新元素中&#xff0c;用于常见页面结 构的包括header footer footer nav aside aside article section hgroup 。 下面简单介绍一下这个元素&#xff1a; 1.header header>元素定义文档的页面组合&#xff0c;通 常是一些引导和导航信息&#xff0c;标签…

Hazelcast入门指南第5部分

这是我撰写的有关Hazelcast的一系列文章的延续。 我强烈建议您阅读其他内容&#xff1a; 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4部分 。 让人一见倾心的东西&#xff1f; 这篇文章中将没有Hazelcast专用代码。 让我重复一遍。 这篇文章中将没有Hazelcast…

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

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

jquery鼠标事件

click()   为点击事件绑定一个事件处理函数&#xff0c;或者触发元素点击事件。   .click( handler(eventObject) )     handler(eventObject)       每次事件触发时候执行的函数。   .click([eventData],handler(eventObject))     eventData      …

[LaunchPad] 超声波测试,数码管显示

1 #include "io430g2553.h"2 3 unsigned char Disp_Tab[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 4 unsigned char dispbit[8]{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 5 6 unsigned char LedOut[4];7 8 …

Spring的依赖注入陷阱

Spring框架中有三种注入变量&#xff1a; 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点&#xff0c;并且不仅只有一种正确的方法。 例如现场注入&#xff1a; Autowired private FooBean fooBean;在生产代码中使用它通常不是最好…

jquery 操作css 选择器

.addClass()   为每个匹配的元素添加指定的样式类名   .addClass(className)     className 为每个匹配元素所有增加的一个或多个样式名   .addClass(function(index,currentClass))     函数返回一个或者多个用空格隔开&#xff0c; index 表示参数匹配中的索引…

vim设置

一、基本编辑功能1、复制、剪切和粘贴复制特定的某一段&#xff1a;把光标移到要复制的文本的头部&#xff0c;按下“v”&#xff0c;往后移动光标&#xff0c;光标所过之处的字符>都会高亮&#xff0c;移到欲复制文本的尾部后&#xff0c;按下“y”&#xff0c;高亮文本全部…

jquery表单属性筛选元素

$(":button") 选择所有按钮元素类型为按钮的元素。 等于$(input[type"button"]) $(":checkbox") 选择所有类型为复选框的元素。 等于$(input[type"checkbox"]) $(":checked") 选择所有勾选的元素。 $( "input:checked&…

Hamcrest Matchers的高级创建

介绍 上一次 &#xff0c;我讨论了Hamcrest Matcher是什么&#xff0c;如何使用以及如何制作。 在本文中&#xff0c;我将解释创建Hamcrest Matchers的更多高级步骤。 首先&#xff0c;我将分享如何使您的匹配器更易于类型安全&#xff0c;然后介绍无状态匹配器的一些技术&…

嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】

最为简单的代码&#xff0c;只用到一个寄存器P1DIR。因为点亮的led灯&#xff08;p1.0和p1.1&#xff09;的管脚是p1的&#xff0c;要输出就得将这两个管脚设置为输出管脚。该寄存器用0~8对应1.0~1.8管脚。 1 //main.c2 #include <ioCC2430.h>3 4 #define uint unsigned …

博客园CodingLife模板样式优化

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

如何允许用户自定义UI

理念 利用JavafX / FXML的声明性设计模式&#xff0c;并允许用户仅通过使用例如SceneBuilder打开某个视图即可重新定制布局或添加新控件&#xff0c;甚至根据用户需要更改样式&#xff0c;从而无需任何编码即可自定义某个视图。 FXML文件 CSS基本上可以放置在通过URL可以到达的…