asp.net core路由配置

原创 Laughing  2017-10-26 13:29  阅读 92 次 评论 0 条

在asp.net core MVC中,默认路由配置是通过controller、action、parameter的形式配置的,我们可以参考startup.cs中的代码

  1. app.UseMvc(routes =>  
  2.            {  
  3.                routes.MapRoute(  
  4.                    name: "default",  
  5.                    template: "{controller=Home}/{action=Index}/{id?}");  
  6.            });  

自定义路由配置

出了使用默认的路由配置之外,我们可以自己定义其他的路由,我们可以参考默认的路由配置,添加一条如下的信息

不同路由的name必须是不同的。路由按照从上到下的顺序进行匹配
  1. app.UseMvc(routes =>  
  2.             {  
  3.                 routes.MapRoute(  
  4.                     name: "default1",  
  5.                     template: "{action=Index}/{id?}",  
  6.                     defaults:new {controller="Home"}  
  7.                     );  
  8.             });  

这样我们在访问/Home/PostDetail/1时,系统会自动匹配到第一个规则,所以返回的信息会是/PostDetail/1

路由约束

以下面代码为例,如果我们不添加约束的话,我们访问/PostDetail/1,可能我们实际想访问的是/About/PostDetail/1,但是我们可能会访问成/Home/PostDetail/1,所以路由约束可以更加精准的控制我们要访问的地址。

  1. app.UseMvc(routes =>  
  2.             {  
  3.                 routes.MapRoute(  
  4.                     name: "default1",  
  5.                     template: "{action=Index}/{id?}",  
  6.                     defaults:new {controller="Home"},  
  7.                     constraints:new {Action="About"}  
  8.                     );  
  9.             });  

通过实现接口IRouteConstraint实现约束

我们首先创建一个实现IRouteConstraint的类

  1. using System;  
  2. using Microsoft.AspNetCore.Http;  
  3. using Microsoft.AspNetCore.Routing;  
  4.   
  5. namespace NetCoreStudy.WebUI.Extensions.Route  
  6. {  
  7.     public class GuidConstraint : IRouteConstraint  
  8.     {  
  9.         bool IRouteConstraint.Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)  
  10.         {  
  11.             if(values.ContainsKey(routeKey)){  
  12.                 var guid = values[routeKey] as Guid?;  
  13.                 if(!guid.HasValue){  
  14.                     var stringValue = values[routeKey] as string;  
  15.                     if(!string.IsNullOrEmpty(stringValue)){  
  16.                         Guid parseGuid;  
  17.                         Guid.TryParse(stringValue,out parseGuid);  
  18.                         guid=parseGuid;  
  19.                         return(guid.HasValue && guid.Value!=Guid.Empty);  
  20.                     }  
  21.                 }  
  22.             }  
  23.             return true;  
  24.         }  
  25.     }  
  26. }  

修改刚才的路由规则如下

  1. app.UseMvc(routes =>  
  2.             {  
  3.                 routes.MapRoute(  
  4.                     name: "default1",  
  5.                     template: "{action=Index}/{id?}",  
  6.                     defaults:new {controller="Home"},  
  7.                     constraints:new {id=new GuidConstraint()}  
  8.                     );  
  9.             });  

我们再次访问/PostDetail/1 时,由于1不满足guid,所以会返回404

获取路由字典

Controller中获取

RouteData.Values["action"];

View中获取

@ViewContext.RouteData.Values["controller"]

本文地址:https://www.lisen.me/asp-net-core-routing-configuration.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情