我在ASP.NET Core 2.2应用程序中无法为Razor页面设置路由约定(我正在从传统的MVC迁移到Razor页面)。
我正在使用文档中建议的标准Pages文件夹结构,但我想稍微自定义生成的路由。
例如,在Products文件夹中的Details.cshtml页面上,我具有以下指令:
@page "{id:int}
此页面的URL为:
/Products/Details/42
但是我希望该URL为:
/Products/42
我希望这在全球范围内适用,而不仅仅是在“产品详细信息”页面上。该文档对此并不特别清楚。
所以这似乎是这样做的方法:
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相比,这似乎是一项巨大的工作,但是我可以看到,它可以实现更好的控制。