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
相关产品推荐
相关产品推荐

