El sistema de routing en ASP.NET MVC es un componente clave de este sistema, básicamente nos permite crear un sistema de mapeo para poder encontrar/llamar a los controladores y acciones de ellos, y aunque con algunas plantillas ya viene un sistema de routing como el siguiente en algunos casos no es suficiente:

routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

Ahora, vamos a crear un nuevo controller con una par de acciones (sin una funcionalidad real):

public class AdminController : Controller { public ActionResult Login(int id, string role) { ViewBag.Id = id; ViewBag.Role = role; return View(); } public ActionResult SearchByName(string name) { ViewBag.Name = string.Format("Searching... {0}", name); return View(); } }

Y luego las view para cada acción:

@{ Layout = null; } Search By Name

Search Admin by Name

@ViewBag.Name

y

@{ Layout = null; } Login

Admin Login

@ViewBag.Id

@ViewBag.Role

Ahora si para la acción SearchByName se quiere que responda a una URL semejante a: http://>/Admin/ obtenemos el siguiente error:

image

Y básicamente el error se da porque no se tiene un mapeo similar al que se requiere, así que ya tenemos un caso en el cual el routing por defecto no va bien, entonces vamos a añadir uno nuevo:

routes.MapRoute( name: "AdminSearch", url: "admin/{name}", defaults: new { controller = "Admin", action = "SearchByName" } );

Bien, y ahora la pregunta es, dicho routing debe ir antes o después del routing por defecto? La respuesta es antes, ya que esas rutas siempre se leen en el orden en que son definidas, el mismo caso se repite cuando se quiere acceder a la acción Login del AdminController, pero en este caso se añade la siguiente ruta:

routes.MapRoute( name: "Admin", url: "admin/login/{id}/{role}", defaults: new { controller = "Admin", action = "Login" } );

Espero les sirva el post, saludos!

Descarga el ejemplo!