Taking the example of a Stack Overflow question like this one the URL is:
so.com/questions/1142480/adding-redundant-information-to-a-mvc-route
However, the functional part of the URL is:
so.com/questions/1142480
The way this is achieved is by defining a route like this:
routes.MapRoute(
"questions",
"questions/{id}/{title}",
new { controller = "Questions", action = "Details", title = "" });
You then create a link to it like this:
<%= Html.RouteLink("Adding Redundant Information to a MVC Route",
new
{
controller = "Questions",
id = 1142480,
title = "adding-redundant-information-to-a-mvc-route"
}
)
%>
I would imagine the URL title is created from the actual title by lower casing, replacing spaces with dashes and a couple of other things (escaping/striping bad characters).
So long as your SEO route appears before any other matching route the SEO route will be used.
For complete clarity the controller would actually be like this:
public class QuestionsController : Controller
{
public ActionResult Details(int id)
{
// stuff for display - notice title is not used
}
}