[ASP.NET MVC] Trabajando con el sistema de routing

Posted on Actualizado enn


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;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Search By Name</title>
</head>
<body>
    <div>
        <h1>Search Admin by Name</h1>
        <p>@ViewBag.Name</p>
    </div>
</body>
</html>

y

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Login</title>
</head>
<body>
    <div>
        <h1>Admin Login</h1>
        <p>@ViewBag.Id</p>
        <p>@ViewBag.Role</p>
    </div>
</body>
</html>

Ahora si para la acción SearchByName se quiere que responda a una URL semejante a: http://<dominio>/Admin/<nombre a buscar> 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!

Un comentario sobre “[ASP.NET MVC] Trabajando con el sistema de routing

    […] [ASP.NET MVC] Trabajando con el sistema de routing […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s