asp.net mvc 4 - MVC 4 creando url tipo slug
asp.net-mvc-4 url-rewriting (1)
Estoy tratando de crear un stackoverflow como url.
Yo el siguiente ejemplo funciona bien. Pero si elimino el controlador, se produce un error.
http://localhost:12719/Thread/Thread/500/slug-url-text
Tenga en cuenta que el primer hilo es el controlador, el segundo es la acción.
¿Cómo puedo hacer que la URL anterior se vea como la siguiente excluyendo el nombre del controlador de la url?
http://localhost:12719/Thread/500/slug-url-text
Mis rutas
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}/{ignoreThisBit}",
new
{
controller = "Home",
action = "Index",
id = "",
ignoreThisBit = ""
}); // Parameter defaults )
}
}
Controlador de hilo
public class ThreadController : Controller
{
//
// GET: /Thread/
public ActionResult Index()
{
string s = URLFriendly("slug-url-text");
string url = "Thread/" + 500 + "/" + s;
return RedirectPermanent(url);
}
public ActionResult Thread(int id, string slug)
{
return View("Index");
}
}
Colocar la siguiente ruta antes de la definición de ruta predeterminada llamará directamente a la acción ''Subproceso'' en el controlador ''Subproceso'' con el parámetro ''id'' y ''slug''.
routes.MapRoute(
name: "Thread",
url: "Thread/{id}/{slug}",
defaults: new { controller = "Thread", action = "Thread", slug = UrlParameter.Optional },
constraints: new { id = @"/d+" }
);
Entonces, si realmente quieres que sea como , y asumes que alguien ingresa la parte id y no la parte slug,
public ActionResult Thread(int id, string slug)
{
if(string.IsNullOrEmpty(slug)){
slug = //Get the slug value from db with the given id
return RedirectToRoute("Thread", new {id = id, slug = slug});
}
return View();
}
espero que esto ayude.