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.

1 comentario:

Anónimo dijo...

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