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) })