【问题标题】:Razor Page routing via DynamicRouteValueTransformer always returns 404通过 DynamicRouteValueTransformer 的 Razor 页面路由始终返回 404
【发布时间】:2021-08-10 22:39:36
【问题描述】:

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

这是一个简单的测试用例。任何关于可能出错的提示,或者我如何解决问题,我们将不胜感激!

在 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,它成功地选择了我的转换器,但对结果没有任何作用。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core razor-pages


    【解决方案1】:

    您的代码中有两处错误。首先MapDynamicControllerRoute 用于选择控制器动作,而不是用于选择页面处理程序。您需要使用的是MapDynamicPageRoute。其次,page 路由键的值应该是以/ 开头的路径。所以你需要"/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" }
    };
    

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2019-07-03
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2017-10-07
      • 2019-05-22
      相关资源
      最近更新 更多