通过 DynamicRouteValueTransformer 的 Razor 页面路由总是 returns 404

Razor Page routing via DynamicRouteValueTransformer always returns 404

我在 ASPNET Core 5 Razor Pages 应用程序中使用自定义动态路由转换器。我的 TransformAsync 覆盖按预期调用,并且 returns 到页面的自定义路由,但该页面从未加载,并且请求始终 returns 404。Razor 页面都找不到我正在访问的页面路由到,或者它只是忽略了我的自定义路由。

这是一个简单的测试用例。非常感谢任何关于可能出错的提示,或者我如何解决问题![​​=15=]

在 Startup.Configure(..) 我有

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
    endpoints.MapDynamicControllerRoute<LaunchPageTransformer>("{**id}");
});

我的 LaunchPageTransformer:DynamicRouteValueTransformer 实现:

public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
   return await Task.Run(() =>
   {
       return new RouteValueDictionary()
       {
           { "page", "Test" },
           { "id", "123" }
       };
   });
}

在 Pages/Test.cshtml 我有

@page "{id}"
@model Launch.Pages.TestModel
@{
}

并在 Pages/Test.cshtml.cs:

public class TestModel : PageModel
{
   public void OnGet(int? id)
   {
   }
}

我正在导航到 localhost:44351/123,它成功地选择了我的变压器,但对结果没有任何影响。

您的代码中有两处错误。首先 MapDynamicControllerRoute 用于选择控制器操作,而不是用于选择页面处理程序。你需要使用的是MapDynamicPageRoute。其次,page route key 的值应该是以/ 开头的路径。因此,您需要 "/Test".

而不是 "Test"

这是您需要的最终代码(替换您的代码):

endpoints.MapDynamicPageRoute<LaunchPageTransformer>("{**id}");

在您的实施中 LaunchPageTransformer:

return new RouteValueDictionary()
{
    //we need to use a / to prefix the page name here
    { "page", "/Test" },
    { "id", "123" }
};