cómo implementar la reescritura de URL similar a SO

Necesito implementar SO como funcionalidad en mi sitio asp.net MVC.

Por ejemplo, cuando el usuario vaya a https://stackoverflow.com/questions/xxxxxxxx

después de cargar, la línea de asunto se concatena con la url y la URL se vuelve así https://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship

La parte anterior “/ rails-sql-search-through-has-one-relation” se agrega a la url.

En webforms es simple, podría usar la reescritura de url. Pero no estoy seguro de cómo lograr esto en MVC

La siguiente línea es del archivo Global.asax

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Account", action = "LogOn", id = UrlParameter.Optional } // Parameter defaults ); 

la cadena que necesito para concatenar está en mi base de datos por lo que se obtiene desde allí. ¿Cómo puedo lograr esto?

Esto se llama una ruta de babosas. Una forma de lograr esto es definir una ruta con un parámetro slug opcional, y en el método del controlador comprobar si el parámetro se ha proporcionado

 routes.MapRoute( name: "Question", url: "Question/{id}/{slug}", defaults: new { controller = "Question", action = "Details", slug = UrlParameter.Optional } ); 

Luego, en QuestionController (supone que siempre se proporcionará una identificación)

 public ActionResult Details (int id, string slug) { if (string.IsNullOrEmpty(slug)) { // Look up the slug in the database based on the id, but for testing slug = "this-is-a-slug"; return RedirectToAction("Details", new { id = id, slug = slug }); } var model = db.Questions.Find(id); return View(model); } 

Está buscando una ruta personalizada. Si te fijas bien, a SO no le importa la parte del texto de la URL. Asi que:

  http://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship AND http://stackoverflow.com/questions/xxxxxxxx/ 

Ambos funcionarán. Puedes hacerlo fácilmente con algo como:

 routes.MapRoute( "Question", "questions/{id}/{title}", new { controller = "Question", action = "Details" }); 

El truco es agregar el “slug” al final cuando creas enlaces:

 @Html.RouteLink( "Read more.", "Question", new { id = question.Id, title = Slugger.ToUrl(question.Title) })