RazorPages 修改路由模板

Posted

技术标签:

【中文标题】RazorPages 修改路由模板【英文标题】:RazorPages modify routing template 【发布时间】:2021-03-03 20:34:30 【问题描述】:

我在 .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 页面实现上述目标?

【问题讨论】:

看看创建自定义IPageRouteModelConvention:learnrazorpages.com/advanced/custom-route-conventions 【参考方案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。

【讨论】:

以上是关于RazorPages 修改路由模板的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP NET Core 2.0 Razor 页面进行路由

Flask框架—— 反向解析配置信息路由系统模板请求响应闪现请求扩展session

如何在 Razor Pages 路由的开头添加应用程序名称?

路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用

路由策略---华为实验,不懂得可以当模板用

如何匹配 Razor Pages 中的多个路由?