如何为ASP.NET Razor Pages的URL添加.html后缀?
给ASP.NET Razor Pages页面添加.html后缀路由
你之前的代码问题出在AddPageRoute的用法上——这个方法是给单个页面指定自定义路由,参数顺序是「页面路径」在前,「路由模板」在后,而且不能用通配符来全局配置。下面是两种可行的实现方式:
方法一:全局给所有页面添加.html后缀(保留原无后缀路由)
修改Program.cs中的配置,通过路由约定批量修改所有页面的路由模板:
builder.Services.AddRazorPages().AddRazorPagesOptions(opt => { // 遍历所有页面的路由规则,添加.html后缀 opt.Conventions.AddFolderRouteModelConvention("/", model => { foreach (var selector in model.Selectors) { var originalTemplate = selector.AttributeRouteModel.Template; // 跳过根页面(单独处理) if (!string.IsNullOrEmpty(originalTemplate)) { selector.AttributeRouteModel.Template = $"{originalTemplate}.html"; } } }); // 单独配置根页面的.html路由(localhost/index.html → Pages/Index.cshtml) opt.Conventions.AddPageRoute("/Index", "index.html"); });
AddFolderRouteModelConvention("/", ...)会作用于Pages文件夹下的所有页面,把每个页面原有的路由模板(比如Login)修改为Login.html。- 根页面(
Index.cshtml)默认路由是空字符串,所以需要单独用AddPageRoute指定index.html的路由规则。 - 这种方式下,原无后缀路由(比如
localhost/login)依然可以访问。
方法二:仅保留带.html的路由(禁用无后缀访问)
如果不想让用户通过无后缀URL访问页面,可以修改代码移除原路由规则,只保留带.html的版本:
builder.Services.AddRazorPages().AddRazorPagesOptions(opt => { opt.Conventions.AddFolderRouteModelConvention("/", model => { // 先保存原有的路由选择器,再清空列表 var originalSelectors = model.Selectors.ToList(); model.Selectors.Clear(); foreach (var selector in originalSelectors) { var originalTemplate = selector.AttributeRouteModel.Template; if (!string.IsNullOrEmpty(originalTemplate)) { // 创建新的路由选择器,添加.html后缀 var newSelector = new SelectorModel(selector) { AttributeRouteModel = new AttributeRouteModel { Template = $"{originalTemplate}.html" } }; model.Selectors.Add(newSelector); } } }); // 根页面仅保留index.html路由 opt.Conventions.AddPageRoute("/Index", "index.html"); // 移除根页面的默认空路由(可选,若要禁用localhost直接访问根页面) opt.Conventions.RemovePageRoute("/Index", ""); });
- 这里先保存原路由选择器,清空后只添加带.html后缀的新规则,原无后缀路由就会失效。
- 最后一行代码可以移除根页面的默认空路由,强制用户通过
index.html访问首页。
内容的提问来源于stack exchange,提问作者Najam
相关产品推荐
相关产品推荐

