私は MVC 4 で Web サイトを作成しており、質問をルーティングするための 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 を修正します。ルーティングには不要ですが、スラッグが常に存在し、正しいことを望みます。
これは私の現在の実装です:
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);
}
私の懸念は、スラッグが間違っている/欠落している場合のリダイレクトです。この実装では、ビューに解決するために必要な作業 (ID によるアイテムのクエリとタイトルのスラッグ化) の 2 倍の作業が必要になる場合があります。さらに悪いことに、アクションごとにリダイレクト コードを複製する必要があります。
コードの重複、パフォーマンス、および SEO への影響に関して、使用できるより良い実装はありますか?