我正在尝试使用 DynamicRouteValueTransformer
与 IEndpointRouteBuilder.MapDynamicControllerRoute
动态映射新路线。这适用于在应用程序运行时添加的页面。
我正在做:
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");
捕获所有尚未分配路由的网址,以便
RouteValueTransformer
有需要的可以试试找。通过在 RouteValueTransformer.TransformAsync
中放置一个断点方法,我可以看到它何时运行。如果您只是输入任何无意义的网址,它将按预期进入该方法。对于没有分配路由的 url,但 url 的前面部分有,它不会进入该方法,因为它似乎认为它已经有一个路由,但它显然给出了 404 错误。例如,如果在上述行之后我做
endpoints.MapControllerRoute(
name: "test",
pattern: "category/product1",
defaults: new { controller = "Home", action = "Index" });
然后尝试浏览到“category/product2”,我认为应该输入
TransformAsync
尝试查找路线的方法,但它没有,并给出 404。如果您将“类别”更改为其他内容,它将进入该方法。我不确定这是否是预期的行为、错误,或者我是否使用了“模式”参数错误,或者 {**slug} 错误?
繁殖
很容易重现。创建一个新的 ASP.NET Core 3.1 Web 应用程序。添加
app.UseEndpoints(endpoints =>
{
var defaults = new { controller = "Home", action = "Index" };
endpoints.MapControllerRoute(name: "test", pattern: "category/product1", defaults: defaults);
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");
});
到最后
Startup.Configure
,services.AddSingleton<RouteValueTransformer>();
至
Startup.ConfigureServices
,和
public class RouteValueTransformer : DynamicRouteValueTransformer
{
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
return values;
}
}
并在
return values;
上设置断点看看它什么时候运行。我还尝试过什么
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{one}/{two}");
- 也不进入方法。查看文档。
DynamicRouteValueTransformer
上的内容不多(yet)不幸的是,我发现这很困难。更新
我开始认为这很可能是一个错误,所以我提出了 this Github issue
最佳答案
这是一个错误,并计划进行修复。见 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1#conventional-routing-order
关于c# - 当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971600/