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

ASP.NET MVC(C#)如何实现URL显示名称而非ID且仍按ID查询数据

ASP.NET MVC 实现URL展示博客标题、后台通过BlogId查询数据方案

核心实现思路

URL中不直接暴露数字类型的blogId,而是将博客标题处理为URL友好的唯一标识(Slug)放在URL路径中,后台请求进入后先通过Slug匹配到对应博客的blogId,后续所有CRUD逻辑仍然沿用你之前基于blogId写的代码即可,不需要改动核心业务。


具体实现步骤

  • 第一步:为博客表新增Slug字段,生成URL友好的标题标识
    原始博客标题包含空格、特殊字符甚至中文,直接拼接在URL里会导致路由解析失败,因此需要提前处理为适合URL传输的格式,建议直接在博客表新增BlogSlug字符串字段持久化存储,避免每次请求动态计算的性能损耗。
    新增Slug生成辅助方法:

    using System.Text.RegularExpressions;
    public static class SlugHelper
    {
        public static string GenerateSlug(string blogTitle)
        {
            if (string.IsNullOrWhiteSpace(blogTitle)) return string.Empty;
            // 转小写、去除首尾空白
            var slug = blogTitle.ToLowerInvariant().Trim();
            // 保留字母、数字、中文、空格,移除其余特殊字符
            slug = Regex.Replace(slug, @"[^a-z0-9\u4e00-\u9fa5\s-]", "");
            // 把连续的空格、横杠替换为单个横杠
            slug = Regex.Replace(slug, @"[\s-]+", "-");
            return slug;
        }
    }
    

    在创建、编辑博客的提交逻辑中,调用上述方法生成Slug,同时校验同Slug是否已存在:如果存在就在Slug末尾追加数字后缀(比如my-first-blog-1),保证全局唯一后存入数据库。记得给BlogSlug字段加数据库索引,提升查询速度。

  • 第二步:修改路由规则,适配Slug参数
    把针对博客详情、编辑、删除的自定义路由放在默认通用路由之前,避免被默认路由拦截。
    如果是ASP.NET MVC 5(.NET Framework),修改App_Start/RouteConfig.cs:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        // 博客详情路由
        routes.MapRoute(
            name: "BlogDetail",
            url: "blog/{slug}",
            defaults: new { controller = "Blog", action = "Details" }
        );
        // 博客编辑路由
        routes.MapRoute(
            name: "BlogEdit",
            url: "blog/edit/{slug}",
            defaults: new { controller = "Blog", action = "Edit" }
        );
        // 博客删除路由
        routes.MapRoute(
            name: "BlogDelete",
            url: "blog/delete/{slug}",
            defaults: new { controller = "Blog", action = "Delete" }
        );
        // 默认路由放在最后
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    

    如果是ASP.NET Core MVC,修改Program.cs的路由配置:

    app.MapControllerRoute(
        name: "BlogDetail",
        pattern: "blog/{slug}",
        defaults: new { controller = "Blog", action = "Details" }
    );
    app.MapControllerRoute(
        name: "BlogEdit",
        pattern: "blog/edit/{slug}",
        defaults: new { controller = "Blog", action = "Edit" }
    );
    app.MapControllerRoute(
        name: "BlogDelete",
        pattern: "blog/delete/{slug}",
        defaults: new { controller = "Blog", action = "Delete" }
    );
    // 默认路由配置放在后面
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
  • 第三步:修改控制器Action逻辑,兼容原有基于blogId的查询
    把原来接收int id参数的Action改为接收string slug参数,第一步先通过Slug查到对应博客实体拿到blogId,后续所有业务逻辑和你之前写的完全一致,不需要改动。
    以详情Action为例:

    public ActionResult Details(string slug)
    {
        if (string.IsNullOrWhiteSpace(slug)) return new HttpNotFoundResult();
        // 通过URL传入的slug查到对应博客
        var currentBlog = db.Blogs.FirstOrDefault(b => b.BlogSlug == slug);
        if (currentBlog == null) return new HttpNotFoundResult();
        
        // 后续逻辑完全沿用你之前基于blogId的写法即可,比如查关联评论、校验权限等
        // 例:var comments = db.Comments.Where(c => c.BlogId == currentBlog.BlogId).ToList();
        return View(currentBlog);
    }
    

    编辑、删除的Action逻辑完全一致:先根据slug拿到对应博客的blogId,再执行原来的更新、删除逻辑即可。

  • 第四步:修改视图中的链接生成规则
    所有跳转到博客详情、编辑、删除页的链接,不再传递id参数,改为传递slug参数。
    比如原来的列表页跳转代码:

    @Html.ActionLink("查看", "Details", new { id = item.BlogId })
    @Html.ActionLink("编辑", "Edit", new { id = item.BlogId })
    

    修改为:

    @Html.ActionLink("查看", "Details", new { slug = item.BlogSlug })
    @Html.ActionLink("编辑", "Edit", new { slug = item.BlogSlug })
    

注意事项

  • 不推荐直接动态编码原始标题作为URL参数:这种方式每次请求都要做编码解码,而且一旦博主修改了博客标题,旧的URL会直接404,SEO和用户体验都很差。
  • Slug必须做全局唯一校验,否则会出现多个博客匹配同一个URL的冲突问题。
  • 如果需要兼容旧的带ID的URL,可以在旧的id路由逻辑中做301跳转到新的Slug URL,避免死链影响SEO。

内容的提问来源于stack exchange,提问作者Asif Tufail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:09:18