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 页面中的自定义路由的主要内容,如果未能解决你的问题,请参考以下文章