我正在用 MVC 4 编写一个网站,并且想部分复制 Stack Exchange 的路由问题样式。例如:
stackoverflow.com/questions/15191392和
stackoverflow.com/questions/15191392/not-the-real-title和
stackoverflow.com/questions/15191392/can-i-avoid-this-redirect-to-fix-or-add-蛞蝓
所有路由到相同的问题并更正 URL。我希望 slug 始终存在且正确,即使路由不需要它。
这是我目前的实现:
routes.MapRoute("Item", "{id}/{slug}/{action}",
new {controller = "Item", action = "Index", slug = UrlParameter.Optional},
new { id = @"\d+", slug = @"(?-i)[-a-z]*", action = @"(?-i)(|[A-Z][a-zA-Z]*)" });
routes.MapRoute("Default", "{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional});
在ItemController.cs
:
public ActionResult Index(int id, string slug = null)
{
var item = GetItem(id);
var itemSlug = ToSlug(item.Title);
if (slug != itemSlug)
{
return RedirectToActionPermanent("Index", new {id, slug = itemSlug});
}
return View(item);
}
如果 slug 错误/丢失,我关心的是重定向。此实现可能需要两倍于解析视图所需的工作量(通过 ID 查询项目并 slug-ify 标题)。更糟糕的是,我需要为每个操作复制重定向代码。
关于代码重复、性能和 SEO 影响,我可以使用更好的实现吗?