介绍。RouteCollection(路由集合)

返璞归真 asp.net mvc (2) – 路由(System.Web.Routing)

1001匹配了行程由于模板的Id变量,即id变量的价值是1001

3、Global.asax.cs

Values
//一个RouteValueDictionary的泛型字典集合,存储了路程由于变量的默认值。Key是程由于变量的称谓,Value是变量的价值。
//这是于RouteCollection的MapRoute方法中经defaults参数配置的对象
//存储的凡模板变量的默认值
//请求的Url如果与路由模板匹配成功则这字典存储的变量默认值会于轮换为Url中之及Key对应的变量值
//如果Key不有则会丢弃来大
//如果如落查询字符串则仍是采取Request[“查询字符变量”]

图片 1<?xml version=”1.0″?>
图片 2<configuration>
图片 3  <system.web>
图片 4    <httpHandlers>
图片 5
图片 6      <!–
图片 7      配置一个自定义的 HttpHandler,用于拍卖后缀名为 xxx 的页面
图片 8      如果未待将 *.xxx 交给路由处理,而是直接为指定的 HttpHandler 处理,请参见 Global.asax 中之配置
图片 9      –>
图片 10      <add verb=”*” path=”*.xxx” type=”MVC.RoutingDemo.XXXHttpHandler” />
图片 11
图片 12    </httpHandlers>
图片 13    <httpModules>
图片 14      
图片 15      <!–
图片 16      UrlRoutingModule – 用于匹配 asp.net 应用程序中的路由的 http 请求
图片 17          该模块找到匹配路由后,会找 IRouteHandler 对象,以找该路由,然后从该路由处理程序获取一个 IHttpHandler 对象,并以该目标用作当前恳请的 http 处理程序
图片 18      –>
图片 19      <add name=”UrlRoutingModule” type=”System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
图片 20      
图片 21    </httpModules>
图片 22  </system.web>
图片 23</configuration>
图片 24

 

2、Web.config

 

作者:webabcd

RouteUrl(
)
//与Action方法类似,区别在于可指定路由于名称,UrlHelper将因路由的称变更一个路由地址

[索引页]
[源码下载]

RouteData
//当前之路由信息

介绍
System.Web.Routing – 此命名空间提供用于 URL
路由的类,通过此类可以行使不映射到大体文件的 URL

横流:常量不见面作控制器或Action,这片只段子要以变量的花样定义。

图片 25using System;
图片 26using System.Collections.Generic;
图片 27using System.Linq;
图片 28using System.Web;
图片 29using System.Web.Mvc;
图片 30using System.Web.Routing;
图片 31
图片 32namespace MVC
图片 33图片 34图片 35{
图片 36    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
图片 37    // visit http://go.microsoft.com/?LinkId=9394801
图片 38
图片 39    public class MvcApplication : System.Web.HttpApplication
图片 40图片 41    图片 42{
图片 43        public static void RegisterRoutes(RouteCollection routes)
图片 44图片 45        图片 46{
图片 47图片 48            /**//* 路由方向:自上而下,查找到相当的饶失去处理,而非见面延续往下开配合配 */
图片 49
图片 50图片 51            /**//*
图片 52             * RouteCollection – 路由汇
图片 53             *     RouteCollection.IgnoreRoute() – 指定的地方不由路由拍卖
图片 54             *     RouteCollection.Add() – 新增一个路由配置
图片 55             *     RouteCollection.MapRoute() – 映射一个路由(Add() 方法的简化版,内部会活动调用 MvcRouteHandler)
图片 56             */
图片 57
图片 58            // .asd 文件未走此路由
图片 59            routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
图片 60            // .xxx 文件未走此路由
图片 61            routes.Add(new Route(“{resource}.xxx/{*pathInfo}”, new StopRoutingHandler()));
图片 62
图片 63
图片 64图片 65            /**//*
图片 66             * RouteValueDictionary – 不区分轻重缓急写的 key/value 字典表
图片 67             * Route – 路由的连带信息
图片 68             *     Route.Url – 路由的 url 匹配模式,{ } 内的为用般配的路由参数名
图片 69             *     Route.Defaults – 路由参数的默认值
图片 70             *     Route.RouteHandler – 路由相应之路由处理程序
图片 71             *     Route.DataTokens – 自定义需要传递的数码
图片 72             *     Route.Constraints – 约束参数值的可行(可以是正则表达式(不区分轻重缓急写),也足以是兑现了 IRouteConstraint 的对象)
图片 73             */
图片 74
图片 75            Route route = new Route(
图片 76                “Routing/{parent}/{child}”,
图片 77
图片 78                // RouteValueDictionary – 可以吸纳一个匿名对象为参数,属性名转换为 key, 属性值转换为 value
图片 79图片 80                new RouteValueDictionary(new 图片 81{ parent = “ria”, child = “silverlight”, controller = “Product”, action = “Index” }),
图片 82
图片 83                new RoutingDemo.MyRouteHandler()
图片 84            );
图片 85图片 86            route.DataTokens = new RouteValueDictionary(new 图片 87{ token1 = “abc”, token2 = “xyz” });
图片 88
图片 89            // HttpMethodConstraint – 实现了 IRouteConstraint 接口的类,用于约束 http 方法
图片 90图片 91            route.Constraints = new RouteValueDictionary(new 图片 92{ parent = @”^[a-zA-Z]+$”, httpMethod = new HttpMethodConstraint(“GET”) });
图片 93
图片 94            // 将程由于上加进路由汇,名称可以无设置,但得唯一(也得不安装路由于名称)
图片 95            routes.Add(“MyRoutingDemo”, route);
图片 96            // routes.Add(route);
图片 97
图片 98
图片 99            // * – 路由为支撑过渡配符
图片 100            // {*param} – 代表匹配任意值,其中路由参数名也 param
图片 101图片 102            routes.Add(new Route(“Wildcard/{*param}”, new RouteValueDictionary(new 图片 103{ controller = “Product”, action = “Index” }), new RoutingDemo.MyRouteHandler()));
图片 104
图片 105
图片 106            // MapRoute() 封装了 Add(), MapRoute() 内部会活动调用 MvcRouteHandler
图片 107            // 其中必须要生 controller 项和 action 项
图片 108            // 其中设置 namespaces 参数相当给 route.DataTokens[“Namespaces”] = namespaces;
图片 109            routes.MapRoute(
图片 110                “Products”,
图片 111                “ProductList/{pageIndex}”,
图片 112图片 113                new 图片 114{ controller = “Product”, action = “Index”, pageIndex = 0 }
图片 115            );
图片 116
图片 117            routes.MapRoute(
图片 118                “Default”,                                              // Route name
图片 119                “{controller}/{action}/{id}”,                           // URL with parameters
图片 120图片 121                new 图片 122{ controller = “Home”, action = “Index”, id = “” }  // Parameter defaults
图片 123            );
图片 124        }
图片 125
图片 126        protected void Application_Start()
图片 127图片 128        图片 129{
图片 130            RegisterRoutes(RouteTable.Routes);
图片 131
图片 132            // 调试路由(需要 RouteDebug.dll),调用如下语句后,会当每个页面还亮详细的路由信息
图片 133            // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
图片 134        }
图片 135    }
图片 136}
图片 137
图片 138
图片 139// 部署在 iis 应注意
图片 140// 配置通配符映射程序,类似如下地址
图片 141// C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll   
图片 142// 不要勾选“确认文件是否有”

因为要的Url没有供变量值,所以利用了默认值对模板进行填空充,模板最终生成的地点是:employees/Home/Index

OK
[源码下载]

当一个客户端的请求于劳务端截获,路由于体制会遍历全局路由于列表查找和请求的Url相兼容的路由,匹配成功后会见使反射机制激活请求地址被之Controller所对应之Controller类。路由机制于激活哪一个Controller有其的一律拟判断方式,你需要开的即使是参照如下规则斟酌应如何注册路由:

  • IRouteHandler –
    路出于处理程序接口,自定义之路由处理程序都如促成者接口
  • RequestContext – 封装所请求的路由的连锁消息及时之 http 上下文信息
  • RouteData – 所请求的路由的相关消息
  • RouteCollection – 路由汇
  • RouteValueDictionary – 不区分轻重缓急写的 key/value 字典表
  • Route – 路由的连带信息

以此达成下文对象用于注册区域路由,提供区域之音信。

图片 143using System;
图片 144using System.Collections.Generic;
图片 145using System.Linq;
图片 146using System.Web;
图片 147
图片 148using System.Web.Routing;
图片 149
图片 150namespace MVC.RoutingDemo
图片 151图片 152图片 153{
图片 154图片 155    /**//// <summary>
图片 156    /// 路由处理程序
图片 157    /// </summary>
图片 158    public class MyRouteHandler : IRouteHandler
图片 159图片 160    图片 161{
图片 162图片 163        /**//*
图片 164         * IRouteHandler – 路由处理程序接口,自定义的路由处理程序都如兑现这接口 
图片 165         *     该接口有一个艺术 IHttpHandler GetHttpHandler(RequestContext requestContext)
图片 166         *     此方法要回到一个拍卖该路由的 http 处理程序 (HttpHandler)
图片 167         * RequestContext – 封装所请求的路由的有关消息及目前底 http 上下文信息
图片 168         *     RequestContext.HttpContext – 当前之 http 上下文信息
图片 169         *     RequestContext.RouteData – 所请求的路由的相关消息
图片 170         */
图片 171
图片 172        public IHttpHandler GetHttpHandler(RequestContext requestContext)
图片 173图片 174        图片 175{
图片 176            return new MyHttpHandler(requestContext);
图片 177        }
图片 178    }
图片 179
图片 180图片 181    /**//// <summary>
图片 182    /// 自定义之 http 处理程序,由路由于决定下谁 http 处理程序
图片 183    /// </summary>
图片 184    public class MyHttpHandler : IHttpHandler
图片 185图片 186    图片 187{
图片 188图片 189        public RequestContext RequestContext 图片 190{ get; private set; }
图片 191        
图片 192        public MyHttpHandler(RequestContext context)
图片 193图片 194        图片 195{
图片 196            RequestContext = context;
图片 197        }
图片 198
图片 199        public void ProcessRequest(HttpContext httpContext)
图片 200图片 201        图片 202{
图片 203图片 204            /**//*
图片 205             * RouteData – 所请求的路由的连带消息
图片 206             *     RouteData.Values – 一个字典表(key – 路由参数;value – 路由值)
图片 207             *     RouteData.DataTokens – 自定义需要传递的数,也是一个字典表
图片 208             *     RouteData.GetRequiredString(string key) – 获取指定的路由参数所对应的路由值
图片 209             */
图片 210
图片 211            httpContext.Response.Write(“相关参数为:<br />”);
图片 212            foreach (var dic in RequestContext.RouteData.Values)
图片 213图片 214            图片 215{
图片 216                httpContext.Response.Write(dic.Key + ” : ” + dic.Value + “<br />”);
图片 217            }
图片 218
图片 219            httpContext.Response.Write(“相关Token为:<br />”);
图片 220            foreach (var dic in RequestContext.RouteData.DataTokens)
图片 221图片 222            图片 223{
图片 224                httpContext.Response.Write(dic.Key + ” : ” + dic.Value + “<br />”);
图片 225            }
图片 226        }
图片 227
图片 228        public bool IsReusable
图片 229图片 230        图片 231{
图片 232图片 233            get 图片 234{ return false; }
图片 235        }
图片 236    }
图片 237
图片 238图片 239    /**//// <summary>
图片 240    /// 如果发生 n 多之路由处理程序,为了方便调用,减少代码,我们得拿其状成一个 Factory 类,如下:
图片 241    /// </summary>
图片 242    public class RouteHandlerFactory : IRouteHandler
图片 243图片 244    图片 245{
图片 246        private string _name;
图片 247        public RouteHandlerFactory(string name)
图片 248图片 249        图片 250{
图片 251            _name = name;
图片 252        }
图片 253
图片 254        public IHttpHandler GetHttpHandler(RequestContext requestContext)
图片 255图片 256        图片 257{
图片 258            if (_name == “My”)
图片 259                return new MyHttpHandler(requestContext);
图片 260
图片 261            return new MyHttpHandler(requestContext);
图片 262        }
图片 263    }
图片 264
图片 265图片 266    /**//// <summary>
图片 267    /// 演示不经过路由,根据 web.config 中的 HttpHandler 相关安排,由此 HttpHandler 直接处理有关请球。具体部署见 Global.asax
图片 268    /// </summary>
图片 269    public class XXXHttpHandler : IHttpHandler
图片 270图片 271    图片 272{
图片 273        public XXXHttpHandler()
图片 274图片 275        图片 276{
图片 277
图片 278        }
图片 279
图片 280        public void ProcessRequest(HttpContext context)
图片 281图片 282        图片 283{
图片 284            context.Response.Write(context.Request.Url.ToString());
图片 285        }
图片 286
图片 287        public bool IsReusable
图片 288图片 289        图片 290{
图片 291图片 292            get 图片 293{ return false; }
图片 294        }
图片 295    }
图片 296}

url: “{controller}/{action}/{id}” ,
defaults: new { controller = “Home” , action = “Index” , id = UrlParameter.Optional }

示例
1、MyHandler.cs

            public void ProcessRequest ( HttpContext context )
            {
                context.Response.Write ( “这是自从定义的路由处理程序” );
            }
        }
    }
}

System.Web.Routing下之类别

总长由于相当正是在Application的PostResolveRequestCache事件处理中实践的,一旦匹配成功GetRouteData
方法会返回一个RouteData实例,RouteData的RouteHandler属性是一个放权的MvcRouteHandler类型的对象,此目标实现了IRouteHandler接口,该接口定义了一个GetHttpHandler(RequestContext requestContext )的措施,此方式的GetHttpHandler方法返回的凡一个贯彻了IHttpHandler接口的MvcHandler类型的目标,最终于默认情况下本着路由请求的拍卖还是出于MvcHandler完成的。MvcRouteHandler类的一部分实现大概要下面代码所示:

汝得在web.config文件的<system.webServer>配置节下注册于定义之HttpModule模块。HttpApplication会自动从web.config文件被围观模块,模块都须兑现IHttpMoudle接口,接口定义了Dispose和Init两单道,Init会接收一个HttpApplication的参数。而于ASP.NET
MVC中,进入管道的Http请求会受HttpModule捕获,在ASP.NET
MVC中抓获请求的凡一个实现了IHttpMoudle的UrlRoutingModule类,它实现HttpModule的Init方法(初始化模块),在此法中才待也HttpApplication注册一个称呼PostResolveRequestCache的事件就能够挡住请求,UrlRoutingModule的片实现大概只要下面代码所示:

代表程由于列表的近乎,此类通过RouteTable.Routes获得。

意味着全局路由的类似

2.引进注册路由时带来上命名空间,因为若全局路由表中有多个概念在不同命名空间下的同名的控制器,那么路由于体制将无法激活控制器,因为其不晓得您到底要乞求哪一个控制器,毕竟,请求的Url中Controller只是一个名,它从不带有控制器所于的命名空间的字符串。所以,建议在注册路由时供命名空间,显示地提供命名空间后连夺后续查找。

路由模板的变量默认值

RouteHandler
//一个兑现了IRouteHandler接口的对象,默认是MvcRouteHandler类型的对象
//该目标提供接口方法GetHttpHandler(),该方式好回到一个用以拍卖时路由请求的处理程序,此属性用于安装或获得可处理时路由请求的IRouteHandler对象 

ASP.NET MVC中之路由

Route有一个Defaults的性质,设置Defaults是防范当呼吁的Url没有供变量值时将祭默认值填充路由模板,如果要的Url提供了变量值则不会见使Defaults。

details匹配了路由于模板的Controller变量,即Controller变量的价值是details 

public class UrlRoutingModule : IHttpModule
{
    public RouteCollection RouteCollection { get => RouteTable.Routes; set; }
    protected virtual void Dispose ( ); //实现IHttpModule接口的Dispose方法
    protected virtual void Init ( HttpApplication application ) //实现IHttpModule接口的Init方法
    {
        application.PostResolveRequestCache += OnApplicationPostResolveRequestCache; //为HttpApplication注册PostResolveRequestCache事件
    }
    private void OnApplicationPostResolveRequestCache ( object sender , EventArgs e ) //PostResolveRequestCache事件的事件处理程序
    {
        HttpContext contex = ( sender as HttpApplication ).Context;
        HttpContextBase contextWrapper = new HttpContextWrapper ( contex );
        RouteData routeData = RouteCollection.GetRouteData ( contextWrapper ); //将请求的Url和路途由于进行匹配,如果匹配成功则归一个储存时程由于信息之RouteData实例

MVC-AreaRegistrationTypeCache.xml

定义路由模板

路由模板被之变量都存储于字典中,在ASP.NET
MVC中,一个路由模板必须带有名称也Controller和Action的变量,以下简单栽方式都得为字典添加键值对。 

民俗的Url请求被的employees是文件夹,GetList则是现实的物理文件,而路由请求被之em不是文本夹,All也不是情理文件。路由地址之补益显而易见,它隐藏了真正文件的地点,而且方便寻找引擎优化。

VirtualPath
//获取已经成匹配的路由所非常成的路由地址,如类似这样:employee/3001

每个区域还配备出一个晚缀为xxxRegistration的cs文件,这样的文件被还定义了一个派生自AreaRegistration类(区域基类)的子类,表示为一个区域。在区域类的RegisterArea方法吃得以此时此刻区域下报路由,如下面代码所示:

//约束了controller变量的价值必须是4个数字 同时该要必须是GET的
constraints: new { controller = @”\d{4}”, httpMethod = new HttpMethodConstraint (“GET”) },

对接下就是解析MvcHandler如何激活控制器的:ASP.NET
MVC – 控制器

defaults: new { controller = “Home” , action = “Index” }
//如果请的Url没有提供controller变量的价值与action变量的价则以默认值进行填空

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start ( )
    {
        AreaRegistration.RegisterAllAreas ( );
        //……
    }
}

    namespaces: new string [ ] { “My.Controllers” } ,  //优先使用My.Controllers命名空间下的Controller
    defaults: new { controller = “Home” , action = “Index” , id = UrlParameter.Optional }
);

ASP.NET的管道

            RequestContext requestContext = new RequestContext
            {
                HttpContext = contextWrapper ,
                RouteData = routeData
            };
            routeData.RouteHandler = new MyRouteHandler ( );
            IHttpHandler handler = routeData.RouteHandler.GetHttpHandler ( requestContext ); //针对Http路由请求的自定义处理程序
            contex.RemapHandler ( handler ); //为当前呼吁指定处理程序
        }
    }
    public class MyRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler ( RequestContext requestContext )
        {
            return new MyHttpHandler ( );
        }

employeeDetails匹配了路程由于模板的Action变量,即Action变量的值是employeeDetails 

之所以下的Url可以匹配上面定义之路由模板:

得到或创路由地址

    protected virtual IHttpHandler GetHttpHandler ( RequestContext requestContext )
    {
        //……
        return new MvcHandler ( requestContext );
    }
}

RequestContext(特殊的Http上下文)

//区域FirstAreaAreaRegistration的RegisterArea方法接收一个AreaRegistrationContext
public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
       
name:”FirstArea_default”,
       
url:”FirstArea/{controller}/{action}/{id}”,
       
defaults:new { action = “Index”, id = UrlParameter.Optional }
    );
}

Route有一个constraints属性,该属性用于为行程由于安装约。有半点种方式得以添加路由约,一是行使正则式,二凡是从定义一个束缚类 

程由于相当规则

该类包了即的路由信息和Http请求的上下文

HttpContext
//获取一个HttpContextBase类型的象征手上Http请求的上下文

Url: “employee / { controller } / { action } / { id }”
//这是一个路由模板(也称Url模板、Url模式)
//每个被 / 分隔的段称为segment
//每个segment可以产生三三两两栽类型的参数
//要么是segment常量,要么是segment变量
//segment常量就是一个文本值
//segment变量则使用:{ 变量名 },以此作为占位符

倘项目结构非常大就需使用区域,可以把区域看成是项目之一个一个底子系统。右击项目-添加-区域即可创建一个区域,每个区域都含有了Controller、Model和View目录。比如以下创建了一个称也FirstArea的区域,区域默认包含在象征全区域的到底目录Areas中,此后足右击Areas目录来创造更多的区域。

注册路由

包装了视图上下文(ViewContext)和路由列表集合(RouteCollection),视图上下文(ViewContext)从控制器上下文(ControllerContext)派生。

此类表示为区域基类,我们以开立一个区域时便是在创立一个AreaRegistration的派生(上面例子中之FirstAreaAreaRegistration就是一个AreaRegistration的子类)。AreaRegistration提供一个RegisterAllAreas的静态方法,此办法会扫描所有被眼前种所引述的程序集,查找所有由AreaRegistration派生的种类,同时会new出每一个区域之实例,这些实例都以为用作是AreaRegistration类型的变量。与此同时,RegisterAllAreas方法还会指向各国一个区域创建它们所对应之AreaRegistrationContext实例,区域实例的RegisterArea方法需要一个AreaRegistrationContext作为参数以便注册区域路由,所以RegisterAllAreas创建出AreaRegistrationContext实例后会见拿其看作参数传递给相应之区域实例的RegisterArea方法以便调用AreaRegistrationContext的MapRoute方法对区域路由于进行登记。

随着我们用在报之路由上采取该约束
只待在constraints中初始化该约束类即可  

假如非确定要吧变量设置哪些的默认值,那就将变量的默认值设为UrlParameter.Optional即可。

 

该类包了突出的Http上下文(RequestContext)和路由列表集合(RouteCollection)

2.要你想禁止路由于体制匹配当前命名空间之外的控制器(后续查找),则可以如下设置:

ASP.NET
MVC –
学习到底目录

AreaRegistration(区域)

同区域有涉及的类似

图片 297

VirtualPathData(路由于信息)

http://www.cnblogs.com/employees/GetList.aspx

        //嵌套类
        private class MyHttpHandler : IHttpHandler
        {
            public bool IsReusable => throw new NotImplementedException ( );

 

使路由地址是这么的:

 

ActionLink ( )
//根据参数创建一个涵盖路由地址之超链接
//Controller类没有HtmlHelper类型的属性,HtmlHelper是当WebViewPage<dynamic>类的一个属性(Html)而留存的
//所以只能在视图页面使用这仿佛
//示例:HtmlHelper作为View的特性Html被以,所以可以以视图页面使用HtmlHelper
<body>
    @Html.ActionLink( “员工列表” , “employeeList” ) /*http://localhost/Default/employeeList\*/
    @Html.ActionLink( “员工列表” , “employeeList” , new { gender = “men” } ) /*http://localhost/Default/employeeList?gender=men\*/
    @Html.ActionLink( “员工列表” , “employeeList” , new RouteValueDictionary { { “gender” , “men” } } ) /*同上*/
    @Html.ActionLink( “员工列表” , “employeeList” , “Employee” , new { gender = “men” } , new { fontSize = “12px” } )  /*http://localhost/Employee/employeeList?gender=men\*/
    @Html.ActionLink( “员工列表” , “employeeList” , “Employee” , “http” , “cnblogs” ,””, new { gender = “men” } , new { fontSize = “12px” } ) /*http://cnblogs/Employee/employeeList?gender=men\*/
</body>

RouteData(路由于信息)

Route
//获取路由对象

Route
//获取路由对象

总长由于相当的意思是:当用户以浏览器地址栏输入一个Url后,这个Url请求会发送到服务端,由劳动端的处理程序解析,所有的路由都注册在RouteTable的路由列表中,路由于体制会自行在RouteTable的路由列表中寻找和Url匹配的路由。路由模板定义在Route的Url属性中,也便要我们设登记一个路由,就要为程由于定义一个路由模板,这个模板被放在Route的Url属性中。

//当请求的路由地址为服务端接收后,服务端将在全局路由于范围外搜索匹配的路由模板
//假而于另外一个档或者不同命名空间下在同名的Controller,那么路由于体制如何规定应将请路由于至哪个Controller中也?
//通过点名namespaces可以使路由于查找体制优先考虑采用namespaces所指定的Controller
routes.MapRoute (
    name: “Default” ,
    url: “{controller}/{action}/{id}” ,

区域路由地址被的段默认会加上区域之称号,如:

public class MvcRouteHandler : IRouteHandler
{
    //…… 

AreaRegistrationContex(区域上下文)

//如果在AreaRegistrationContex的MapRoute中显示指定了路由的命名空间,则这属性会被匹配所忽略,匹配将考虑以MapRoute中指定的命名空间

RouteCollection(路由集合)

 

表示单个路由的切近

 

namespace MVC.Controllers
{
    public class MyRoutingModule : IHttpModule
    {
        public RouteCollection RouteCollection { get => RouteTable.Routes; }
        public void Dispose ( ) { }

ASP.NET中之路由

呼吁的Url的段数与路由模板的段数必须等且常量值相等。

url: “Files / { controller } / { action } / { name } / { *otherSegments }”
//请求的Url如果没有最后一个截,也能配合,如果请的Url提供了otherSegments的值。那么这样的变量会蕴藏在RouteValueDictionary字典中,可通过Key获取

        public void Init ( HttpApplication application )
        {
            application.PostResolveRequestCache += OnApplicationPostResolveRequestCache;
        }

使用*声泪俱下定义之变量不见面介入配合,如:

意味着存储路由有关信息之类似,当求的路由地址为成功解析后会生成一个RouData对象,此目标可以透过在Controller类或Page类中之RouData属性访问获得。 

路由约束

RouteValueDictionary(路由于变量字典)

        private void OnApplicationPostResolveRequestCache ( object sender , EventArgs e )
        {
            HttpContext contex = ( sender as HttpApplication ).Context;
            HttpContextBase contextWrapper = new HttpContextWrapper ( contex );
            RouteData routeData = RouteCollection.GetRouteData ( contextWrapper );

HtmlHelper类

constraints: new { LocalhostConstraint = new LocalhostConstraint ( ) }

图片 298

在Global文件的Application_Start事件受到默认使用了AreaRegistration的静态方法将富有区域开展了合的初始化。

ASP.NET
MVC也下System.Web.Routing命名空间中由体制,但其有别于ASP.NET WEB
Forms中之路由,在System.Web.Mvc程序集中发生一个RouteCollectionExtentions类,此类为System.Web.Routing.RouteCollection类定义了同雨后春笋之扩充方法专门用于ASP.NET
MVC框架下之路由机制。扩展出了MapRoute、IgnoreRoute等方式,使用MapRoute注册的路由必须拥有Contrller和Action。

MapRoute()
//在时AreaRegistrationContext所关联的区域下报一个区域性的路由
//示例:在区域类的RegisterArea方法被登记区域路由于:
public override void RegisterArea ( AreaRegistrationContext context )
{
    context.MapRoute (
        name: “” ,
        url: “FirstArea/{controller}/{action}/{id}” ,
        defaults: new { action = “Index” , id = UrlParameter.Optional }
    );
}

HttpModule(Http模块)和 HttpHandler(Http处理程序)**

Action ( )
//根据参数创建一个路由地址并活动发起基于该路由地方之呼吁,并返一串HTML,HTML是打服务端返回的多少

RouteLink ( )
//与ActionLink方法类似,区别在可指定路由于名称,HtmlHelper将根据路由的名称创建一个含路由地址的超链接

public class FirstAreaAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get => “FirstArea”;
    }

State
//一个object类型的用户从定义的对象,当于Global文件之Application_Start事件备受实践AreaRegistration的重载方法RegisterAllAreas(object State)时,State将会见赋值给创建有底AreaRegistrationContext的State属性

UrlHelper类

这个命名空间下定义了跟路由机制有关的型

不必匹配的变量值

正则式约束

GetVirtualPath ( RequestContext requestContext,RouteValueDictionary values )
//遍历全局路由于列表,查找和values存储的路由变量完全匹配的路由
//如果匹配成功则归一个VirtualPathData对象,否则回null。通过VirtualPathData.VirtualPath可以收获到相当成功后底路由地址
//示例:在有页面中:
string employeeID = RouteData.Values [ “id” ] as string;
System.Web.Routing.RequestContext context = new System.Web.Routing.RequestContext ( );
context.HttpContext = new HttpContextWrapper ( HttpContext.Current );
context.RouteData = RouteData;
string s = RouteData.Route.GetVirtualPath ( context , RouteData.Values ).VirtualPath; //return like:/employees/sam/1001
 
GetVirtualPath ( RequestContext requestContext,RouteValueDictionary values , string RouteName )
//根据参数指定的路由名称找到该路由,将values存储的路由变量和该路由的路由模板进行匹配
//如果配合成功则赶回一个VirtualPathData对象,否则回null。通过VirtualPathData.VirtualPath可以博得到相当成功后的路由地址
 
GetRouteData(RequestContext httpContext);
//如果手上恳求的Url成功匹配了行程由于模板则赶回跟眼前呼吁相关的、存储了路程由于信息的RouteData实例
//示例:手动创建一个HttpContextBase,通过代码来效仿一不善客户端的乞求以便获得RouteData
HttpRequest request = new HttpRequest ( “/Home/Index” , “http://localhost:53326/Home/Index” , null );
HttpResponse response = new HttpResponse ( new System.IO.StringWriter ( ) );
HttpContext context = new HttpContext ( request , response );
HttpContextBase contextWraper = new HttpContextWrapper ( context );          
routeData =RouteTable.Routes.GetRouteData ( contextWraper );
 
RouteExistingFiles
//如果以之属性设为true,则怀有Url请求都拿强制路由于相当。默认false,也就以默认情况下,Url地址的模式可以是某文件地点之模式也堪是路程由于模板的模式
//比如假设现在恳求的凡aspx页面,在浏览器直接输入是页面的地址:http://localhost/default.aspx,因为默认情况下RouteExistingFiles是false,所以对这个页面的直接请求并不会进入路由匹配。

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute( //在时下区域注册路由
         
  name:”FirstArea_default”,
         
  url:”FirstArea/{controller}/{action}/{id}”,
         
  defaults:new { action = “Index”, id = UrlParameter.Optional }
        );
    }
}

眼看是一个现缓存的xml文档,ASP.NET
MVC框架会扫描时路援的程序集,利用反射将顺序集中的从AreaRegistration派生的花色集合成一个列表,然后针对它进行序列化以便生成xml文档。这样,当AreaRegistration调用它的静态方法RegisterAllAreas创建区域实例的时,就足以直接从xml文档将AreaRegistration列表反序列化为类型列表,省去了每次都要反射造成资源大量消耗的麻烦。

//如果注册非区域路由于时没当MapRoute中指定namespaces,那么RouteData.DataTokens[“Namespaces”]或Route.DataTokens[“Namespaces”]都==null
//如果在登记区域路由于时莫于MapRoute中指定namespaces,那么路由于体制会默认将区域类的命名空间的字符表示拼接一个”.*”的字符作为后缀存储在DataTokens[“Namespaces”]中

从定义约束

 

AreaName
//区域之名目

Ignore ( )
//如果RouteExistingFiles是默认的false,则其它文件还好经过请该公文之大体地址从而赢得这个文件
//如果RouteExistingFiles被手动设为true,那么其他文件还不再可以经请该公文之大体地址从而赢得此文件
//所以在RouteExistingFiles为true的场面下,如果我们怀念搭部分差,比如您莫期望css或js文件的恳求需要经路由地址访问,
//你盼得以经过当浏览器直接输入文件的大体地址便可知访问该种的文件,那么这才起使用Ignore()方法的画龙点睛。
//注意,Ignore()方法要放在路由于登记的前方,否则无效
//示例:
routes.RouteExistingFiles = true; //请求的其他文件要使用路由地址访问
routes.Ignore ( “{resource}.css/{*pathInfo}” ); //指示css文件不必经过路由地址访问
 
IgnoreRoute ( )
//与Ignore()方法等以及
 
MapPageRoute ( )
//注册一个路由,将Url地址映射为路由地址,比如将一个aspx页面地址映射为路由地址,这样你可以透过路由地址指向default.aspx进行走访。
//示例:
RouteTable.Routes.MapPageRoute ( “” , “employees/{name}/{id}/{*other}” , “~/Default.aspx” , true , defaults );
//有了上述之对准实际有一个页面(default.aspx)的路由映射,现在可一直以浏览器输入http://localhost/employees/sam/1001访问到default.aspx
 
MapRoute ( )
//RouteCollectionExtentions为RouteCollection定义之恢宏方法,此办法要引用System.Web.Mvc程序集。
//此措施专门用于在ASP.NET MVC框架下报了名一个路由,区别为MapPageRoute ( )方法
//此方毫无以某一页面的情理地址映射为一个路由地址,它是概念了一个同其它页面进行匹配的路由模板,且模板必须有Contrller和Action变量。
//以下使用MapRoute ( )方法上加了一个路由
//注意,MapRoute()方法的Defaults、Constraint参数不再是RouteValueDictionary,而是object,这是为编程的便利性,最终她还是碰头被路由于体制自动转发为RouteValueDictionary
//示例:
routes.MapRoute (
    name: “Default” ,
    url: “{controller}/{action}/{id}” ,
    defaults: new { controller = “Home” , action = “Index” , id = UrlParameter.Optional }
);

您为堪起定义一个Http模块和HttpHandler处理程序,简单实现如下:

表示存储路由有关信息之近乎

默认值UrlParameter.Optional

ASP.NET本身就是有着路由的建制,只不过没有沾运用,当发起一个伸手时凡一直伸手的该公文之大体地址。其实以System.Web.Routing命名空间中就出一部分有关路由的类型,我们为堪下这些品种将Url请求映射为路由地址,一个传统的Url请求或是这么的:

Namespaces
//这是一个只读之string[]特性,该属性自动将手上区域类的命名空间作为在它们区域外之路由的命名空间并拼接了一个”.*”的字符作为后缀,如:MVC.Areas.FirstArea.*

//如:RouteData.DataTokens[“Namespaces”]=
MVC.Areas.FirstArea.*
 
GetRouteData ( )
//将请的Url和程由于进行匹配,如果匹配失败,返回null,否则回一个RouteData实例
 
GetVirtualPath ( RequestContext requestContext,RouteValueDictionary values )
//将values存储的路由变量和眼前路由的路由模板进行匹配,如果配合成功则归一个VirtualPathData对象,否则回null。通过VirtualPathData.VirtualPath可以博到相当成功后的路由地址
 
GetRequiredString ( string key )
//在RouteData的Values中查找路由变量所对应的价值,key是路程由于变量的称呼。注意,如果key不在则会扔来深。如果要博取查询字符串则还是用Request[“查询字符变量”]
 
Url
//获取路由对象的沙盘,即类似这样的路由模板:employees/{name}/{id}

object obj = new { controller = “default” ,action=”index”};
RouteValueDictionary routeValue = new RouteValueDictionary ( obj );
var controllerName= routeValue [ “controller” ];
var actionName = routeValue [ “action” ];
//或
RouteValueDictionary routeValue2= new RouteValueDictionary
{
    { “controller”,”default” },
    { “action”,”index” }
}

<system.webServer>
    <modules>
       <add name=”MyRoutingModule” type=”MVC.Controllers.MyRoutingModule”/>
    </modules>
</system.webServer>

//当请求发生常,如果以全局路由于列表中匹配上多只不等命名空间下的同名Controlle时拿活动优先考虑Namespaces存储的命名空间下的Controller

        //封装Http上下文对象与路由于信息之例外Http上下文对象,此目标将作为参数传递给HttpHandler处理程序,以便处理程序能得部分当下路由的信
        RequestContext requestContext = new RequestContext
        {
            HttpContext = contextWrapper ,
            RouteData = routeData
        };
          
        IHttpHandler handler= routeData.RouteHandler.GetHttpHandler ( requestContext ); //获取当前路由的处理程序
        contex.RemapHandler ( handler ); //为当前恳请指定处理程序
    }
}

RouteTable(路由表)

DataTokens
//一个RouteValueDictionary的泛型字典集合,存储了路由的命名空间
//通过RouteData.DataTokens[“Namespaces”]或Route.DataTokens[“Namespaces”]可博得路由于所当的命名空间

区域(Area)

 

public class LocalhostConstraint : IRouteConstraint
{
    public bool Match ( HttpContextBase httpContext , Route route , string parameterName , RouteValueDictionary values , RouteDirection routeDirection )
    {
        return httpContext.Request.IsLocal;
    }
}

Route(路由)

ASP.NET
MVC 路由(Routing)

Routes
//获取具有的路由(包含区域路由),返回一个RouteCollection列表。注:如果以RegisterArea方法中经AreaRegistrationContext直接拿走路由于列表的路程由于个数,则止回Areas目录下所富含的区域路由于个数,不含有无区域路由于
//示例:
//在FirstArea区域下之Controller目录中创造了DefaultController并为DefaultController自定义了有限个属性RouteList和RouteCount
namespace MVCArea.Areas.FirstArea.Controllers
{
    public class DefaultController : Controller
    {
        public static System.Web.Routing.RouteCollection  RouteList { get; set; }
        public static int RouteCount { get; set; }
      
        public ActionResult Index()
        {
            ViewData [ “RouteList” ] = RouteList.Count; //包含全局路由,区域路由的路由列表总个数
            ViewData [ “RouteCount” ] = RouteCount; //只有Areas目录下所包含的合区域路由于个数
            return View();
        }
    }
}
//在FirstAreaRegistration类的RegisterArea方法被经过AreaRegistrationContext访问行程由于列表
FirstArea.Controllers.DefaultController.RouteList = context.Routes; //返回全局路由和区域路由的路由列表,在表面调用RouteList.Count时会蕴藏这些路由于列表总个数
FirstArea.Controllers.DefaultController.RouteCount = context.Routes.Count; //在RegisterArea方法中虽然单纯回去Areas目录下所蕴藏的总体区域路由于个数

注册路由时之锤炼

1.路出于查找体制默认是以大局路由表中摸索控制器,如果用限制查找范围,可以显得地啊路由指定命名空间,这意味程由于体制应先行考虑该命名空间下控制器。但如以该命名空间下没匹配到要的控制器,则行程由于体制会持续查找其它命名空间下之控制器(后续查找)。

routes.MapRoute (
    name: “Default” ,
    namespaces: new string [ ] { “MVCArea.Controllers” } ,
    url: “{controller}/{action}/{id}/{*test}” ,
    defaults: new { controller = “Home” , action = “Index” , id = UrlParameter.Optional }
).DataTokens[ “UseNamespaceFallback” ] =false; //默认是true,设为false后,路由于体制就偏偏会以目前命名空间被匹配控制器

Defaults;
//一个RouteValueDictionary泛型字典集合,用于为路由的路由模板设置变量的默认值
//示例:
Route route = new Route ( “employees/{name}/{id}/{*other}” , new PageRouteHandler ( “~/default.aspx” );
route.Defaults= new RouteValueDictionary
{
    { “name”,”sam” },
    { “id”,”1001″ }
};
 
Constraints;
//一个RouteValueDictionary泛型字典集合,用于为程由于设置约,约束用于证明某些自定义之逻辑,没通过验证则路由会失败
route.Constraints = new RouteValueDictionary
{
    { “controller” , @”\d{4}” }, //为路由模板的controller变量设置了正则式约束
    {  “httpMethod”, new HttpMethodConstraint ( “GET” ) } //设置了央约束,请求必须是Get请求
}; 

DataTokens
//一个RouteValueDictionary的泛型字典集合,存储了路由的命名空间
//通过RouteData.DataTokens[“Namespaces”]或Route.DataTokens[“Namespaces”]好博路由于所于的命名空间
//如果注册非区域路由于时没有于MapRoute中指定namespaces,那么RouteData.DataTokens[“Namespaces”]或Route.DataTokens[“Namespaces”]都==null
//如果当注册区域路由于时不曾于MapRoute中指定namespaces,那么路由于体制会默认将区域类的命名空间的字符表示拼接一个“.*”的字符作为后缀存储在DataTokens[“Namespaces”]中
//如:RouteData.DataTokens[“Namespaces”]= Mvc.Areas.FirstArea.* 

起定义约束类必须兑现IRouteConstraint接口,实现的Match()方法返回true表示通过认证。以下创建了一个LocalhostConstraint的类,它实现之Match()方法用于检测请求是否来本地电脑,如果无是虽然免兼容配路由。

Route有一个Url属性,该属性用于为行程由于安装一个路由模板

图片 299

有三三两两个像样可就此来生成基于路由于模板的Url连接(路由地址)。

Action(
)
//根据参数创建一个路由地址
//示例:UrlHelper作为Controller的性能Url被采取,所以可以于控制器的Action中使用UrlHelper
public ActionResult Index ( )
{
    string s0 = Url.Action ( ); // like:/Default/Index
    string s1 = Url.Action ( “index” , new { controller = “default” , id = 1001 } ); // like:/default/index/1001
    string s3 = Url.Action ( “index” , “default” , new RouteValueDictionary { { “id” , 1001 } } , “http” , “www.cnblogs.com” ); // like:http://www.cnblogs.com/default/index/1001
    return View ( );
}

employee匹配了行程由于模板的常量值 

http://www.cnblogs.com/em/All

windows有一个称w3wp的exe工作过程,它和IIS(因特网信息服务器)绑定以并,从IIS6开始,微软引入了应用程序池底定义,一个应用程序池对许正在一个w3wp.exe,多单应用程序池则对诺着多只w3wp.exe。当首潮接受到Http请求时,w3wp.exe会创建.NET运行时(即把ASPNET_ISAPI.dll程序集载入).net运行时搭建得后,就见面以Http请求转交给一个windows的着力组件,叫做Http.Sys,它提供Http访问的接口,使您的应用程序可由此该接口进行Http通信。当Http.Sys确定其是首糟糕接受转交过来的Http请求后,它将开创有一个AppDomainFactory(管理应用程序域的厂子)对象,该对象则会也web应用程序创建有一个应用程序域。接着,定义在System.Web.dll中的System.Web.Hosting命名空间下之IsapiRuntime类被创造出来,从这儿开,IsapiRuntime将接管所有的Http请求。IsapiRuntime会创建一个IsapiWorkerRequest对象,这个目标特别用于封装接收到的Http请求,封装好后,IsapiRuntime会将IsapiWorkerRequest当做参数传递给ASP.NET运行时(HttpRuntime),于是,Http请求正式进入了ASP.NET的拍卖管道。也就,第一个Http请求从发起-到被Http.Sys接收-到呢web程序创建应用程序域-到载入System.Web.dll程序集的System.Web.Hosting命名空间下之IsapiRuntime-到由IsapiRuntime创建封装Http请求的IsapiWorkerRequest-到将IsapiWorkerRequest传递让ASP.NET的HttpRuntime(ASP.NET运行时),
Http请求才算是进入了咱们能够掌控的号。接下来一切就由于ASP.NET掌控全局了。此时,HttpRuntime会做少种工作,第一,它见面冲传递进入的IsapiWorkerRequest创建有代表Http请求的上下文对象,也就是我们灰常熟悉的HttpContext对象。要得到客户端请求的数目要于客户端写副数据都是由此上下文对象的Request、Response来完成的。第二,HttpApplicationFactory会从HttpApplication对象池中任取一个空余的HttpApplication对象用于拍卖Http请求,假如池中莫空余的HttpApplication对象,那么HttpApplicationFactory会自动创建新的HttpApplication用来处理Http请求。当Http请求处理完毕后虽会自行将HttpApplication对象释放及池塘中。

//此属性将当Value存储在Route.DataTokens[“Namespaces”]和RouteData.DataTokens[“Namespaces”]中

图片 300

相关文章