【问题标题】:Custom Routing in ASP.NET Core 2.2 Razor PagesASP.NET Core 2.2 Razor 页面中的自定义路由
【发布时间】:2020-05-06 09:11:47
【问题描述】:

我在为 ASP.NET Core 2.2 应用程序中的 Razor Pages 设置路由约定时遇到问题(我正在从传统 MVC 迁移到 Razor Pages)。

我正在使用文档中推荐的标准 Pages 文件夹结构,但我想稍微自定义生成的路由。

例如,在 Products 文件夹中的 Details.cshtml 页面上,我有以下指令:

@page "{id:int}

此页面的网址是:

/Products/Details/42

但是我希望 URL 是:

/Products/42

我希望它在全球范围内适用,而不仅仅是在“产品详细信息”页面上。文档对此并不是特别清楚。

【问题讨论】:

标签: asp.net routing razor-pages asp.net-core-2.2


【解决方案1】:

所以这似乎是这样做的方法:

https://www.mikesdotnetting.com/article/327/customising-routing-conventions-in-razor-pages

  1. 创建一个实现IPageRouteModelConvention的类:
public class CustomPageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        foreach (var selector in model.Selectors.ToList())
        {
            var template = selector.AttributeRouteModel.Template;
            if (template.EndsWith("Details/{id:int}", StringComparison.OrdinalIgnoreCase))
                selector.AttributeRouteModel.Template = template.Replace("Details/{id:int}", "{id:int}", StringComparison.OrdinalIgnoreCase);
        }
    }
}
  1. Startup.cs注册课程:
services
    .AddMvc()
    .AddRazorPagesOptions(o =>
    {
        o.Conventions.Add(new CustomPageRouteModelConvention());
    });

与旧的 MVC 方式相比,这似乎是一项巨大的工作,但我可以看到它允许更精细的控制。

【讨论】:

    【解决方案2】:

    你需要覆盖整个路由,所以这就是你需要的 -

    @page "/Products/{id:int}"
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2020-05-25
      • 2019-05-22
      • 2020-05-06
      • 2023-03-24
      • 2018-10-18
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多