首页 > 解决方案 > RazorPages 修改路由模板

问题描述

我在 .net 5.0 上使用 Razor 页面。我正在尝试找到一种方法来修改路由模板 URL 以将 ID 放置在路径更高的位置。

我正在构建的站点运行多个项目,并且我希望在 URL 中将 projectID 放在较高的位置,并且页面特定的 ID 仍位于末尾。

默认情况下,我可以看到我可以将 /{area (if exists)}/{folder}/{page}/{ID} 作为路由结构,并且我可以合理地为特定页面添加更多 ID(即... /{page}/{projectID}/{pageID}) 通过在每个页面的 @page {projectID:string}/{pageID:int?} 声明中设置它。

我希望实现的是:

/{projectID}/{area?}/{folder}/{page}/{ID}

我可以看到我是否使用了 MVC 约定,我可以为 endpoints.MapControllerRoute 设置模式模板,但是我可以做些什么来使用 Razor 页面实现上述目标?

标签: c#.net-coreroutesrazor-pages

解决方案


在 Startup.cs 文件中,在 ConfigureServices 方法中找到以下行:

services.AddRazorPages();

将其替换为以下代码:

services.AddRazorPages()
    .AddRazorPagesOptions(options =>
{
    // for the pages of the Identity area
    options.Conventions.AddAreaFolderRouteModelConvention("Identity", "/", model =>
        {
        foreach (var selector in model.Selectors)
        {
            var attributeRouteModel = selector.AttributeRouteModel;
            attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{projectID=1}", attributeRouteModel.Template);
        }
    });
    // for the default pages
    options.Conventions.AddFolderRouteModelConvention("/", model =>
    {
        foreach (var selector in model.Selectors)
        {
            var attributeRouteModel = selector.AttributeRouteModel;
            attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{projectID=1}", attributeRouteModel.Template);
        }
    });
});

这将导致在所有 url 前面添加一个路由值。除非您定义一个,否则所有链接都将获得项目 ID 的值 1。


推荐阅读