.NET Core中如何移除URL中的ID,改用商品名称作为路由参数?
实现商品详情页URL从ID到商品名称的转换
步骤1:调整路由与控制器逻辑
修改路由特性和方法参数,将接收ID改为接收商品名称,同时更新商品查询逻辑:
[Route("/Product/{productName}")] public IActionResult ShowProduct(string productName) { // 若存在同名商品,建议改用唯一的Slug字段(如"productName-109")查询以避免冲突 var product = _productRipository.GetProductByProductName(productName); if (product == null) { return NotFound(); } // 修正原有代码错误:用Where做筛选,而非Select(Select是投影操作) ViewBag.ProductGalleries = product.Product_Galleries .Where(p => p.ProductID == product.ProductID).ToList(); ViewBag.ProductFeatures = product.Product_Features .Where(p => p.ProductID == product.ProductID).ToList(); ViewBag.ProductVideos = product.Product_Videos .Where(p => p.ProductID == product.ProductID).ToList(); ViewBag.ProductFiles = product.Product_Files .Where(p => p.ProductID == product.ProductID).ToList(); return View(product); }
步骤2:实现按商品名称查询的仓库方法
在你的商品仓储类中添加对应的查询方法:
public Product GetProductByProductName(string productName) { // 大小写不敏感匹配,避免因URL大小写导致404 return _context.Products.FirstOrDefault(p => p.ProductName.Equals(productName, StringComparison.OrdinalIgnoreCase)); }
步骤3:优化URL友好性(可选但推荐)
直接使用原始商品名称可能包含空格、特殊字符,建议生成URL友好的Slug:
- 在商品实体中新增
Slug字段,存储处理后的名称(例如"智能手表"转成"zhi-neng-shou-biao",英文名称转成"smart-watch") - 将路由改为
/Product/{slug},查询时匹配Slug字段 - 在商品创建/编辑时自动生成Slug,比如通过替换空格、移除特殊字符实现
关键注意事项
- 若存在同名商品,必须结合ID生成唯一Slug(如"smart-watch-109"),否则会出现URL冲突
- 确保页面中生成商品详情链接的地方,从原来的
/Product/{id}更新为/Product/{productName}或/Product/{slug}
内容的提问来源于stack exchange,提问作者soheila
相关产品推荐
相关产品推荐

