martes, 30 de octubre de 2012
Routers en ASP.NET MVC 3
ASP.NET MVC proporciona una nueva forma de crear aplicaciones web que es más extensible y comprobable.En este documento vamos a tener una mirada más profunda en los dos pilares de ASP.NET MVC - Routers y controladores.
Routers
Uno de los objetivos principales de ASP.NET MVC es la optimización del Search Engine (SEO). Ya que los motores de búsqueda funcionan principalmente mediante direcciones URL. Por lo que una definición de una URL significativa y comprensible es muy importante para que nuestra aplicación sea más amigable para los buscadores.Los Routers es la manera de construir URLs significativo para una solicitud web. Como ya hemos visto, nuestras direcciones URL de aplicaciones MVC no están representados por extensiones como. Aspx. En cambio, las direcciones URL consisten en el nombre del controlador y el nombre de la acción.
Primero vamos a entender cómo funciona el enrutamiento por defecto. Abra el archivo Global.ascx, y podemos ver los métodos Application_Start () y RegisterRoute ().
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// Parameter defaults
);
}
Mire el estado donde traza la ruta. Su URL utiliza el esquema:
"{controller} / {action} / {id}", donde id es un parámetro opcional.
New {controller = "Home", action = "Index", id = UrlParameter.Optional}
Especifica que, en caso de que la URL no especifica un controlador, utilice el controlador "home". Además, en ausencia de una acción, se usa la acción "Index", y el último parámetro es opcional.
Routing data
Podemos acceder a los datos de enrutamiento dentro de un controlador utilizando el objeto RouteData. public ActionResult Index()
{
ViewBag.Message = string.Format("{0}---{1}--{2}",
RouteData.Values["Controller"],
RouteData.Values["action"],
RouteData.Values["id"]
);
return View();
}
Controllers
Ahora vamos a crear un nuevo controlador y ver cómo puede enrutar el nuevo controlador con un patrón de enrutamiento diferente.
Añadir un nuevo controlador con el nombre "Ejemplo" para esto, presione clic derecho sobre la carpeta "Controllers" y add new controler:
Ahora vamos agregar un controller llamado test, el codigo debe quedar de la siguiente manera:
public class EjemploController : Controller
{
//
// GET: /Ejemplo/
public ActionResult Verificar()
{
return Content("Hola soy el controlador ejemplo");
}
}
El funcionamiento normal seria que pudieron entrar con el URL:
Si realizamos un pequeno cambio, de llamar ejemplo sin accion, nos mostrar un error 404 ya que lo intentara redireccionar a index.
Adding a new route
Para solventar el problema agregaremos un nuevo router en global.asax public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"ejemplo",
"ejemplo/{action}",
new { controller = "ejemplo", action = "Verificar" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
El resultado seria:
Es posible que necesitemos enviar algunos datos a nuestro controlador desde la URL.
Asi que vamos a cambiar nuestro Router y controller.
routes.MapRoute( "ejemplo", "ejemplo/{usuario}", new { controller = "ejemplo", action = "Verificar" } ); public ActionResult Verificar(string usuario) { return Content("Hola soy el controlador ejemplo: " + usuario); }
Vamos a probar, note que el controller y su parametro son llamados correctamente:
Sin embargo ahora y no funciona el llamado sin parametro.
Para resolver este problema, debemos cambiar el Router y especificar el parámetro opcional.
routes.MapRoute( "ejemplo", "ejemplo/{usuario}", new { controller = "ejemplo", action = "Verificar", usuario = UrlParameter.Optional } );
El resultado sera:
Bueno con esto termino mi ejemplo principal.
Por ultimo les quiero comentar que los Router tambien pueden servir para hacer alias de de nuestras rutas:
Ejemplo el controller: Home y su metodo: About se utiliza de la siguiente forma:
Podemos agregar al Router para que podemos llamarlo por otro nombre:
routes.MapRoute( "test", // Route name "About2/{action}", // URL with parameters new { controller = "Home", action = "About" } // Parameter defaults );
Resultado:
Bueno espero que les sirva.
Suscribirse a:
Comentarios de la entrada (Atom)
1 comentario:
tengo una página que forma la url de esta forma:
localhost/busqueda?tipoprop=1&tipoopera=1&minimo=&maximo=&moneda=2&pais=1&departamento=1&localidad=
como verán algunos parámetros tienen valor y otros no pero además lo que debería mostrar no es el valor del parámetro sino otra cosa, en este ejemplo la url amigable debería ser
localhost/Casa/Venta/Pesos/Uruguay/Montevideo
siendo:
Casa = tipoprop=1 pudiendo ser 2 (Apartamento), 3 (Local), etc
Venta = tipoopera=1 pudiendo ser 2 (Alquiler), etc
Uruguay = pais=1 pudiendo ser 2 (Argentina), 3 (Brasil), etc
Por lo tanto necesito que se muestren solo los que tienen valor cargado y además que se muestren de la forma indicada.
Como logro esto ?
Gracias
Publicar un comentario