Area--->AreaRegistrationContext.MapRoute

文章引导

              MVC路由解析---IgnoreRoute 

              MVC路由解析---MapRoute 

              MVC路由解析---UrlRoutingModule  

              Area的使用

              Area--->AreaRegister.RegisterAllArea()与Area区域的解析

引言:

               学习本文建议先看下另一篇文章(Area--->AreaRegister.RegisterAllArea()与Area区域的解析),此篇文章着重解析AreaRegistrationContext.MapRoute函数。

       一.先从MapRoute说起

               接着上一篇文章的末尾进行阐述,上一篇文章的末尾为:

                              

               Area的注册过程的第一步先找到所有继承或实现AreaRegistration类的类并序列化之后保存进缓存文件。接着才是重头戏(MapRoute)进行路由注册。

               在AreaRegistrationContext中同样存在同名的MapRoute函数。

 1         public Route MapRoute(string name, string url, string[] namespaces)
 2         {
 3             return this.MapRoute(name, url, null, namespaces);
 4         }
 5 
 6         public Route MapRoute(string name, string url, object defaults, object constraints)
 7         {
 8             return this.MapRoute(name, url, defaults, constraints, null);
 9         }
10 
11         public Route MapRoute(string name, string url, object defaults, string[] namespaces)
12         {
13             return this.MapRoute(name, url, defaults, null, namespaces);
14         }
15 
16         public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
17         {
18             if ((namespaces == null) && (this.Namespaces != null))
19             {
20                 namespaces = this.Namespaces.ToArray<string>();
21             }
22             Route route1 = this.Routes.MapRoute(name, url, defaults, constraints, namespaces);
23             route1.DataTokens["area"] = this.AreaName;
24             bool flag = (namespaces == null) || (namespaces.Length == 0);
25             route1.DataTokens["UseNamespaceFallback"] = flag;
26             return route1;
27         }

 

                在上部代码中可以看到,整个代码的核心最终还是引用的Routes.MapRoute进行路由的注册。

       二.Routes.MapRoute

                Routes就是一个RouteCollection,此处的Routes还需要追溯到上一篇文章

                                   

                下面为AreaRegistrationContext的构造函数,通过构造函数完成This.Routes的初始化赋值。

 1         public AreaRegistrationContext(string areaName, RouteCollection routes, object state)
 2         {
 3             this._namespaces = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 4             if (string.IsNullOrEmpty(areaName))
 5             {
 6                 throw System.Web.Mvc.Error.ParameterCannotBeNullOrEmpty("areaName");
 7             }
 8             if (routes == null)
 9             {
10                 throw new ArgumentNullException("routes");
11             }
12             this.AreaName = areaName;
13             this.Routes = routes;
14             this.State = state;
15         }

                我们接着来看Routes.MapRoute的代码

                            

                上面代码实例化一个Route并对属性进行赋值,其中Constraints和DataTokens值都一样,都是new RouteValueDictionary()。由于route.Constraints为空,则ConstraintValidation.Validate(route)不会运行函数内部代码。此扩展函数最后将信息Add进当前Routes,并返回路由信息route。

                最后对Routes.DataTokens(RouteValueDictionary)添加信息,并返回Route。

                            

       三.总结

                针对某个Area的路由映射是通过相应的AreaRegistration进行注册的,具体来说是在AreaRegistration的RegisterArea方法中调用AreaRegistrationContext对象的MapRoute方法进行注册的。如果在调用MapRoute方法中指定了表示命名空间的字符串,将自动作为注册的路由对象的命名空间,否则会将表示AreaRegistration所在命名空间的字符串加上"."后缀作为路由对象的命名空间。

                这里说的路由对象的命名空间指的是通过Route对象的DataTokens属性表示的RouteValueDictionary对象中Key为Namespaces的字符串数组,而该字符串最终会转移到生成的RouteData的DataTokens中。

 

                除此之外,在调用AareaRegistrationContext的MapRoute方法时,还会在注册Route对象DataTokens中添加一个Key为UseNamespaceFallback的条目表示是否采用后背命名空间 对Controller进行解析。如果注册对象具有命名控件(调用MapRoute方法时指定了命名空间或对应的AreaRegistration类型定义在某个命名空间中),该条目值为false。

                在解析Controller类型过程中,会先通过RouteData包含的命名空间来解析Controller类型。如果Controller类型解析失败,则通过包含RouteData的DataTokens属性key为useNamespaceFallback值来判断是否使用后背命名空间来进行解析。如果为true,则通过当前ControllerBuilder的命名空间解析,如果失败则忽略命名空间直接采用类型名称进行匹配,否则直接抛出异常。

转载于:https://www.cnblogs.com/xiaowangzi1987/p/9795253.html

`routes.IgnoreRoute`、`routes.MapPageRoute`和`routes.MapRoute`是在ASP.NET中用于定义和配置路由规则的方法。它们之间的区别如下: 1. `routes.IgnoreRoute`:这个方法用于忽略某些URL,让它们不被路由系统处理。通常用于忽略某些特定的静态文件或资源,如图片、CSS文件、JavaScript文件等。示例用法如下: ```csharp routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); ``` 上述示例中,我们忽略了以`.axd`为扩展名的资源文件。 2. `routes.MapPageRoute`:这个方法用于定义并注册ASP.NET Web Forms页面的路由规则。它将指定的URL模式映射到实际的物理文件,并可传递参数给目标页面。示例用法如下: ```csharp routes.MapPageRoute("ProductDetails", "products/{category}/{id}", "~/ProductDetails.aspx"); ``` 上述示例中,我们定义了一个名为"ProductDetails"的路由规则,将匹配形如`/products/electronics/123`的URL,并将请求路由到物理文件`ProductDetails.aspx`。其中,`{category}`和`{id}`是路由参数。 3. `routes.MapRoute`:这个方法用于定义并注册ASP.NET MVC控制器和动作方法的路由规则。它将指定的URL模式映射到相应的控制器和动作方法。示例用法如下: ```csharp routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); ``` 上述示例中,我们定义了一个名为"Default"的路由规则,将匹配形如`/Home/Index`的URL,并将请求路由到名为`HomeController`的控制器的`Index`动作方法。其中,`{controller}`、`{action}`和`{id}`是路由参数,`HomeController`和`Index`是默认值。 总结来说,`routes.IgnoreRoute`用于忽略某些URL,`routes.MapPageRoute`用于定义Web Forms页面的路由规则,而`routes.MapRoute`用于定义MVC控制器和动作方法的路由规则。它们各自适用于不同的场景和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值