[TOC] <br/><br/><br/> # <b style="color:#4F4F4F;">简介说明</b> 原文链接: - [路由约束](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-5.0#route-constraint-reference) ``` 版本:Microsoft.AspNetCore.Routing 作用:dotnet core web 路由模块 ``` <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.IRouteTemplateProvider</b> <br/> # <span style="color:#619BE4">[it]-IRouteTemplateProvider()</span> ***** 自定义路由模板,[参考](https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0#ar) <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider { public string Template => "api/[controller]"; public int? Order => 2; public string Name { get; set; } } [MyApiController] [ApiController] public class MyTestApiController : ControllerBase { // GET /api/MyTestApi [HttpGet] public IActionResult Get() { return ControllerContext.MyDisplayRouteInfo(); } } ``` <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.RouteHandler</b> <br/> # <span style="color:#619BE4">[new]-RouteHandler()</span> ***** 路由控制器 <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.RouteBuilder</b> <br/> # <span style="color:#619BE4">[new]-RouteBuilder()</span> ***** 构建路由对象 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` var trackPackageRouteHandler = new RouteHandler(context => { var routeValues = context.GetRouteData().Values; return context.Response.WriteAsync( $"Hello! Route values: {string.Join(", ", routeValues)}" ); }); var routeBuilder = new RouteBuilder(app, trackPackageRouteHandler); routeBuilder.MapRoute( "Track Package Route", "package/{operation:regex(^track|create|detonate$)}/{id:int}"); routeBuilder.MapGet("hello/{name}", context => { var name = context.GetRouteValue("name"); // This is the route handler when HTTP GET "hello/<anything>" matches // To match HTTP GET "hello/<anything>/<anything>, // use routeBuilder.MapGet("hello/{*name}" return context.Response.WriteAsync($"Hi, {name}!"); }); var routes = routeBuilder.Build(); app.UseRouter(routes); ``` <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.RouteValueDictionary</b> <br/> # <span style="color:#619BE4">[new]-RouteValueDictionary()</span> ***** 路由值字典 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` app.Run(async (context) => { var dictionary = new RouteValueDictionary { { "operation", "create" }, { "id", 123} }; var vpc = new VirtualPathContext(context, null!, dictionary, "Track Package Route"); var path = routes.GetVirtualPath(vpc).VirtualPath; context.Response.ContentType = "text/html"; await context.Response.WriteAsync("Menu<hr/>"); await context.Response.WriteAsync($"<a href='{path}'>Create Package 123</a><br/>"); }); ``` <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.IEndpointRouteBuilder</b> <br/> # <span style="color:#619BE4">Map()</span> ***** 映射路由 <br/> # <span style="color:#619BE4">MapGet()</span> ***** 映射Get路由和委托 <br/> # <span style="color:#619BE4">MapControllers()</span> ***** 映射控制器 <br/> # <span style="color:#619BE4">MapDefaultControllerRoute()</span> ***** 映射默认控制器路由 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` // 等同于下述方法 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" ); }); ``` <br/> # <span style="color:#619BE4">MapControllerRoute()</span> ***** 映射控制器路由 <br/> ### 示例内容 <span style="color:red;">1. 传统路由</span> ``` endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" ); ``` <br/> # <span style="color:#619BE4">MapAreaControllerRoute()</span> ***** 映射控制器区域路由 <br/> # <span style="color:#619BE4">MapRazorPages()</span> ***** 映射Razor页面视图 <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.IRouteConstraint</b> <br/> # <span style="color:#619BE4">[it]-IRouteConstraint()</span> ***** 自定义路由匹配器 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` public enum BoolEnum { True, False } public class EnumConstraint : IRouteConstraint { private Type _enumType; public EnumConstraint(string enumTypeName) { _enumType = Type.GetType(enumTypeName); } public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { var value = values[routeKey]; if (value == null) { return false; } if (Enum.TryParse(_enumType, value.ToString(), out object result)) { if (Enum.IsDefined(_enumType, result)) { return true; } } return false; } } services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("enum", typeof(EnumConstraint)); }); ``` <br/> # <b style="color:#4F4F4F;">Microsoft.AspNetCore.Routing.LinkGenerator</b> <br/> # <span style="color:#619BE4">[new]-LinkGenerator()</span> ***** 路由反向生成 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` public void Index([FromServices] LinkGenerator linkGenerator) { linkGenerator.GetPathByAction(HttpContext, controller: "Order", action: "Reque", values: new {name = "abc"} ); } ``` <br/> # <span style="color:#619BE4">GetPathByAction()</span> ***** GetPathByAction <br/> # <span style="color:#619BE4">GetUriByAddress()</span> ***** GetUriByAddress <br/>