ASP.NET Core Razor页面如何配置新闻标题式友好URL
ASP.NET Core Razor页面实现新闻站点友好URL
要把当前的https://localhost:44390/ShowNews?Id=33改成带新闻标题的友好URL(比如/ShowNews/myTitleNews或直接/myTitleNews),需要从路由配置、链接生成、参数接收三个核心环节调整,具体步骤如下:
1. 配置自定义路由规则
在项目的Program.cs中,通过AddRazorPagesOptions为ShowNews页面配置友好路由,分两种场景:
场景1:URL格式为 /ShowNews/myTitleNews
这种格式明确指向新闻页面,不易和其他路由冲突,配置代码如下:
builder.Services.AddRazorPages(options => { // 为ShowNews页面添加路由模板:/ShowNews/{slug} options.Conventions.AddPageRoute("/ShowNews", "{slug}"); });
场景2:URL格式为 /myTitleNews
这种格式更简洁,但需要注意路由优先级,避免和其他页面(如首页、关于页)冲突,配置时可设置较低优先级:
builder.Services.AddRazorPages(options => { // 将根路径下的slug映射到ShowNews页面,设置Order确保其他页面路由先匹配 options.Conventions.MapPageRoute( pageName: "/ShowNews", routeTemplate: "{slug}", routeValues: new { page = "/ShowNews" }, constraints: null, order: 100 // 优先级低于默认页面路由 ); });
2. 修改Razor页面的链接生成代码
原来的链接用asp-route-Id传递新闻ID,现在需要改成传递预先生成的新闻slug(友好标题)。首先确保你的新闻实体有存储slug的字段(如NewsSlug),然后修改链接代码:
<a asp-page="ShowNews" asp-route-slug="@item.NewsSlug">@item.NewsTitle</a>
3. 在ShowNews页面接收slug参数并查询新闻
在ShowNews.cshtml.cs中,通过OnGet方法接收slug参数,并根据slug从数据库查询对应的新闻:
public class ShowNewsModel : PageModel { private readonly IYourNewsService _newsService; public ShowNewsModel(IYourNewsService newsService) { _newsService = newsService; } public NewsDto News { get; set; } public IActionResult OnGet(string slug) { // 根据slug查询新闻 News = _newsService.GetNewsBySlug(slug); if (News == null) { return NotFound(); // 新闻不存在时返回404 } return Page(); } }
4. 生成唯一的新闻Slug(关键前提)
slug需要是唯一、无特殊字符的友好字符串,建议在保存新闻时自动生成并存储到数据库。这里提供一个通用的slug生成方法:
public static string GenerateSlug(string title) { // 移除重音字符 var normalizedTitle = title.Normalize(System.Text.NormalizationForm.FormD); var sb = new StringBuilder(); foreach (char c in normalizedTitle) { var category = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c); if (category != System.Globalization.UnicodeCategory.NonSpacingMark) { sb.Append(c); } } string cleanedTitle = sb.ToString().Normalize(System.Text.NormalizationForm.FormC); // 移除特殊字符、替换空格为连字符、去重连字符并转小写 cleanedTitle = System.Text.RegularExpressions.Regex.Replace(cleanedTitle, @"[^a-zA-Z0-9\s-]", ""); cleanedTitle = System.Text.RegularExpressions.Regex.Replace(cleanedTitle, @"\s+", "-").Trim('-'); cleanedTitle = System.Text.RegularExpressions.Regex.Replace(cleanedTitle, @"-+", "-"); return cleanedTitle.ToLowerInvariant(); }
保存新闻时调用该方法:
var news = new NewsDto { NewsTitle = "我的新闻标题", NewsSlug = GenerateSlug("我的新闻标题"), // 生成slug为"wo-de-xin-wen-biao-ti"或英文的"my-news-title" // 其他字段... }; _newsService.SaveNews(news);
注意事项
- 确保数据库中
NewsSlug字段设置唯一约束,避免多个新闻使用相同slug导致查询错误。 - 如果需要同时兼容ID和slug的路由(比如旧链接跳转),可以添加多路由规则,比如
options.Conventions.AddPageRoute("/ShowNews", "{id}/{slug}"),但需在OnGet中处理两种参数。
内容的提问来源于stack exchange,提问作者mirad100 ssa
相关产品推荐
相关产品推荐

