asp.net 路由学习二

3.RouteTable类

我们所说的路由注册的本质就是创建相应的Route对象并将它加入到RouteTable的静态属性Routes表示的全局路由表。先看一下RouteTable,

public class RouteTable

{

public static RouteCollection Routes{get;}

}

可以看到RouteTable返回一个RouteCollection对象,显而易见全局路由表应该就在这个对象中。接下来看一下RouteCollection类,

        public class RouteCollection : Collection<RouteBase>
        {
            //当我们调用下面3个方法时,会遍历集合中的每一个Route对象。针对每一个Route对象,同名的方法会被调用
            //如果方法返回一个具体的RouteData或VirtualPathData对象,这个对象会直接作为方法的返回值。
            //也就是说,只要遇到满足匹配的route对象,那么这个对象就会作为整个方法的返回值
            //如果每个Route对象返回null,那么整个方法返回的就是null
            public RouteData GetRouteData(HttpContextBase httpContext);
            public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
            public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values);
            //用于注册一个路由模板使路由系统可以忽略具有这个对应模式的URL
            public void Ignore(string url);
            public void Ignore(string url, object constraints);

            //路由映射,一共有5个重载的MapPageRoute方法
            //这个方法与Ignore方法相反,它用于注册某个路径与路由模板之间的映射,其本质就是在本集合中添加一个Route对象
            public Route MapPageRoute(string routeName, string routeUrl, string physicalFile);
            public Route MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess);
        }

当我们在调用MapPageRoute方法时,它会将routeName参数作为对应Route对象的注册名称,这个名称和Route对象的映射关系存在一个属性Dictionary属性里,因此我们是可以通过名称拿到这个Route对象。

4.路由注册

路由注册的核心在于根据提供的路由规则(路由模板,约束,默认值等)来创建一个Route对象,然后添加到RouteTable。先看一个例子:

        public static void RegisterRoutes(RouteCollection routes)
        {
            //指定默认值
            var defaults = new RouteValueDictionary { { "areacode", "010" }, { "day", "2" } };
            //基于正则表达式的约束
            var constains = new RouteValueDictionary { { "areacode",@"0\d{2,3}" },{"day",@"[1-3]"} };
            //表示对变量默认值的说明
            var dataTokens = new RouteValueDictionary { { "defaultCity", "BeiJing" }, { "defaultDays", "2" } };
            //注册路由
            RouteTable.Routes.MapPageRoute("default", "{areacode}/{days}", "~/weather.aspx", false, defaults, constains, dataTokens);
        }

此时,当我们输入localhost:29323;localhost:29323/010;localhost:29323/010/2时,其效果是一样的。解析后的路由数据,如010,2等则存在RouteData.Values里面。其次,如果请求url不满足提供的正则表达式的约束,也是无法与路由对象匹配的。在constains变量中,还可以添加请求方式的约束:{"httpMethod",new HttpMethodConstraint("POST")}。

书上还强调:只有当Route.RouteExistingFiles为true,Route.RouteExistingFiles为true,Route.GetRouteData()返回匹配成功的RouteData对象时,RouteCollection.GetRouteData才能返回一个具体的RouteData对象,这个地方我还是没想明白为什么这样子。

时间: 2024-07-29 00:39:42

asp.net 路由学习二的相关文章

asp.net 路由学习一

从今天开始打算好好学习<ASP.NET MVC5 框架揭秘>这本书,希望让水平来一个质的提高,当然学习笔记还是要写的. asp.net路由:IIS为我们提供里重写url机制,但是这在iis级别上解决了url与物理地址的分离,它的实现依赖于一个注册到IIS管道上的本地代码模块,而asp.net路由则是asp.net机制的一部分,并且是通过托管代码写的.那么到底asp.net机制是什么?首先理解一些常用类和对象.    1.RouteBase类. 路由系统的核心是Route对象,每一个路由注册(不

asp.net 路由学习三

5.根据路由规则生成url ASP.NET路由系统主要有2个方面的应用:通过注册路由模板与物理文件路径的映射实现url和物理地址的分离:通过注册的路由规则生成完整的url:前者通过RouteCollection对象的GetRouteData方法实现,后者通过RouteCollection对象的GetVirtualPath方法实现.再来看看GetVirtualPath这个方法 //共同的参数requestContext表示请求上下文,也就是RouteData和Http上下文的封装, //value

asp.net 路由学习四

8.链接和url的生成 ASP.NET路由系统总的功能可以描述为实现两个方向的路由解析,即针对入栈请求拿到请求的路由和出栈url的生成.对此,ASP.NET MVC定义了两个帮助类,分别为HtmlHelper类和UrlHelper类,这两个类可以根据注册的路由规则生成相应的链接或者url.从本质上来看,这2个类还是依赖于前面的GetVirtualPathData方法.接下来先来看一下UrlHelper类的部分代码 public class UrlHelper { public UrlHelper

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(二)

实例演示:通过路由实现请求地址与.aspx页面的映射 我们创建一个简单的ASP.NET Web Forms应用,并采用一套独立于.aspx文件路径的URL来访问对应的Web页面,两者之间的映射通过路由来实现,我们依然沿用员工管理的场景. 首先我们将员工的所有信息(ID.姓名.性别.出生日期和所在部门)定义在如下所示的Employee类型中,然后定义一个EmployeeRepository类型来维护员工列表的数据.简单起见,员工列表通过静态字段employees表示.EmployeeReposit

asp.net Controller学习二

4.Controller默认激活 Controller对象的激活最终是通过注册的ControllerFactory完成的,当我们没有显示调用ControllerBuilder的SetControllerFactory方法指定ControllerFactory对象时,Controller激活系统会使用一个DefaultControllerFactory对象来激活目标Controller,这就是ASP.NET MVC采用的默认Controller激活机制. 目标Controller对象被激活的前提是

ASP.NET MVC学习二之 Controller

一:简单理解Controller       新建controller必须以命名+controller结尾,controller的职责是负责与Model进行交换并将数据传递给view视图显示给用户 简单的控制器: public class HomeController : Controller { // // GET: /Test/ public ActionResult Index() { return View(); } }   这里,对其进行简单的修改 public string Inde

ASP.NET MVC学习之路由篇(1)

原文:ASP.NET MVC学习之路由篇(1) 一.前言 作为一个从ASP.NET转入到ASP.NET MVC的开发人员而言,可能在开发ASP.NET网站的时候就已经开始在使用路由了. 只不过在ASP.NET MVC中路由是关键部分,而在ASP.NET中需要自行加进去.下面我们将学习ASP.NET MVC中的路由 系统. 二.准备工作 1.新建一个ASP.NET MVC4项目 2.模板选择空 3.在Controllers中添加一个Home控制器 4.打开App_Start中的RouteConfi

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

ASP.NET知识重新梳理(二)------关于ASP.NET知识学习流程的一些理解

ASP.NET知识的学习流程我大概是这么理解的,首先我们必须打好C#的基础,若是之前没有学过C++之类的面向对象语言作为基础,还是要好好看看继承派生多态之类的区别和联系的:其次,当今的编程不仅仅只是我们在学校课堂上所学的控制台应用程序,我们还要学习winfom,WPF之类的本地窗体应用:第三,每个公司的技术方向都是不同的,但是共同的地方是都需要数据库来存储自己的数据,而且sqlserver,mysql,oracle都是大同小异的,所以如果你之前的编程学的不是很好,做一个DBA吧,入门难度也不是很