C# RazorPages修改路由模板

C# RazorPages修改路由模板,c#,.net-core,routes,razor-pages,C#,.net Core,Routes,Razor Pages,我正在使用.NET5.0上的Razor页面。我正试图找到一种方法来修改路由模板URL,以便在路径上方放置一个ID 我正在构建的站点运行着多个项目,我希望projectID在URL中处于较高的位置,页面特定的ID仍然在最后 默认情况下,我可以看到我可以将/{area(如果存在)}/{folder}/{page}/{ID}作为路由结构,并且我可以通过在每个页面的@page{projectID:string}/{pageID:int?}说明中设置,合理地为特定页面添加更多ID(即../{page}/{

我正在使用.NET5.0上的Razor页面。我正试图找到一种方法来修改路由模板URL,以便在路径上方放置一个ID

我正在构建的站点运行着多个项目,我希望projectID在URL中处于较高的位置,页面特定的ID仍然在最后

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

我希望实现的是:

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


我可以看出,如果我使用的是MVC约定,我可以为endpoints.MapControllerRoute设置一个模式模板,但是我可以通过Razor页面实现上述目标吗?

在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,除非您定义了一个值。

在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,除非您定义了值。

查看创建自定义
IPageRouteModelConvention
:查看创建自定义
IPageRouteModelConvention