You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:03:37