Лучший способ сделать это - иметь вторую часть URL-адреса, слизняк, не относящимся к делу с точки зрения того, как выполняется поиск. Ваше определение маршрута будет примерно таким:
routes.MapRoute(
"article"
"articles/{id}/{slug}",
new { controller = "Article", action = "Index", slug = "" }
);
И соответствующее действие:
public ActionResult Index(int id, string slug) {
var article = _repository.GetById<Article>(id);
......
return View();
}
Если вы беспокоитесь о людях, запрашивающих недопустимый слаг с действительным идентификатором (и влияние, которое это может оказать на SEO), то ваше действие контроллера может иметь дополнительную операцию, которая проверяет слаг против статьи и выполняет перенаправление 301 на нужный URL-адрес, если указан неправильный слаг. Кстати, именно это и делает StackOverflow. Если вы измените заголовочную часть URL-адреса вопроса, вы увидите, что сайт перенаправляет вас.