ASP.NET Core 2.2 Razor 页面中的自定义路由

Posted

技术标签:

【中文标题】ASP.NET Core 2.2 Razor 页面中的自定义路由【英文标题】:Custom Routing in ASP.NET Core 2.2 Razor Pages 【发布时间】: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

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

【问题讨论】:

检查这个:- ***.com/questions/37683121/… 那个是Controller/Action路由,不是Pages 【参考方案1】:

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

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

    创建一个实现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);
        
    

    Startup.cs注册课程:
services
    .AddMvc()
    .AddRazorPagesOptions(o =>
    
        o.Conventions.Add(new CustomPageRouteModelConvention());
    );

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

【讨论】:

【参考方案2】:

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

@page "/Products/id:int"

【讨论】:

以上是关于ASP.NET Core 2.2 Razor 页面中的自定义路由的主要内容,如果未能解决你的问题,请参考以下文章