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

ASP.NET MVC/C# 如何移除URL中的记录ID仅保留SEO友好slug

可行实现方案

总共四个核心调整步骤,所有原有视图逻辑无需修改:

1. 调整路由配置

打开RouteConfig.cs,将动物详情的路由放在所有路由的最前面(避免被默认路由拦截),替换原有带id的自定义路由配置:

// 放在RouteConfig.RegisterRoutes方法最开头
routes.MapRoute(
    name: "AnimalSlugRoute",
    url: "animal/{slug}",
    defaults: new { controller = "Animal", action = "Details" },
    constraints: new { slug = @"[\w-]+" } // 可选,限制slug仅包含字母、数字、下划线、横杠,避免匹配到其他无效路径
);
// 原有其他路由(包括默认路由)放在后面

如果之前的SeoFriendlyRoute2自定义路由仅用于提取ID,现在可以直接删除该自定义路由的相关配置,用上述标准路由即可。

2. 修改Animal控制器Details方法入参和查询逻辑

将原来接收id参数的逻辑改为接收slug参数,根据slug查询动物记录:

public ActionResult Details(string slug)
{
    // slug为空直接返回400
    if (string.IsNullOrWhiteSpace(slug))
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    // 你确认slug全局唯一,直接用SingleOrDefault查询即可
    tblAnimal tblAnimal = db.tblAnimals.SingleOrDefault(a => a.Slug == slug);
    // 下面的逻辑完全保留原有代码即可
    if (tblAnimal == null)
    {
        return HttpNotFound();
    }
    return PartialView("_animalProdListPageLoad", tblAnimal);         
}

注意:如果你的slug字段名不是Slug,请替换为你的tblAnimal表中实际存储slug的字段名。

3. 调整全站所有生成动物详情链接的代码

把原来生成链接时传id的逻辑,改为传slug:

<!-- 原来的链接生成代码 -->
@* @Url.Action("Details", "Animal", new { id = item.Animal_Id }) *@
<!-- 改为如下写法 -->
@Url.Action("Details", "Animal", new { slug = item.GenerateSlug2() })

所有跳转、锚点、重定向到动物详情页的位置都要做对应修改。


验证逻辑

修改完成后访问mypictures.com/animal/dog-pictures会自动匹配到Animal控制器的Details方法,传入对应slug查询到正确的Animal记录,返回的Model仍包含完整的Animal_Id字段,原有视图里调用子操作、存隐藏字段、ViewBag赋值的逻辑完全不需要改动,不会影响后续关联数据的加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:18:03