Como organizarse con Áreas en ASP.NET MVC

Por convención, el patrón Modelo/Vista/Controlador, implica que la estructura de nuestra aplicación requiera de tres carpetas Model, Views y Controllers, donde se van añadiendo cada uno de los modelos, los controladores y las múltiples vistas de cada controlador.
Esto a poco que la aplicación vaya creciendo se convierte en un problema, ya que se empiezan a amontonar los ficheros, además de no podernos permitir reutilizar los mismos términos para los controladores.

Imaginemos un caso en el que tengamos dos perfiles, de Administrador y de Usuario. Cada uno tendría su propia pantalla HOME, por lo tanto ya tendríamos el primer problema, al tener que renombrar los controladores a AdministradorHome y UsuarioHome, o alguna chapuza similar.

Lo más útil es poder crear ramas diferentes en nuestra estructura de carpetas y que pudieramos llamarlos de la forma Administrador/Home/Index y Usuario/Home/Index.

Para poder hacer esto debemos recurrir a las Áreas. Esto se introdujo en la versión 2.0, aunque es en la 4.0 donde se integra sin problemas ni tener que hacer tareas extras de configuración. Practicamente ya lo añade todo solo.

Podemos añadir un área, desde el menú contextual del proyecto, con la opción Agregar.

1

Se le da un nombre , Administrador en nuestro caso, y vemos como se crea una carpeta con toda la estructura necesaria, con las carpetas Models, Views y Controllers. Se incluye además un archivo de configuración de las rutas, que afecta solamente al área Administrador. Hacemos lo mismo con el área Usuarios y debería quedar algo asi:

2

Tenemos por tanto tres ficheros de configuración de rutas, los de las áreas, AdministracionAreaRegistration.cs, UsuarioAreaRegistration.cs y el del raiz, RouteConfig.cs

Este sería el contenido de AdministracionAreaRegistration.cs. El de Usuario sería calcado.

using System.Web.Mvc;

namespace task4_csharp.Areas.Administracion
{
    public class AdministracionAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Administracion";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Administracion_default",
                "Administracion/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }

            );
        }
    }
}

Aparte, el de RouteConfig.cs, que es global y se encargaría de la entrada a la aplicación y por tanto de la estructura raiz, tendría este contenido.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace task4_csharp
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

En este caso, como hemos llamado Home al controlador e Index a la acción, y esto existe tanto en el raiz , como en las Áreas de Administración y de Usuario, si ejecutamos, dará un error de rutas repetidas.

/Home/Index

/Administracion/Home/Index

/Usuario/Home/Index

Para ello, se indica el espacio de nombres y así evitamos la ambigüedad.

namespaces: new[] { "task4_csharp.controllers" }

 

¿Cómo navegar por las Áreas?

La función que más lo simplifica, para no volvernos locos con las sobrecargas de los Helpers es la siguiente estructura:

 

@Html.RouteLink("Texto del enlace", new {
action = "nombreAccion",
controller = "nombreControlador",
area = "nombreArea" })

De esta manera, podemos por ejemplo, desde el área de Usuario, acceder al área de Administración, en su home.

@Html.RouteLink("Panel Administracion", new {
action = "Index",
controller = "Home",
area = "Administracion" })

O incluso al raíz, en cuyo caso, dejamos en blanco el parámetro area.

@Html.RouteLink("Menu principal", new {
action = "Index",
controller = "Home",
area = "" })

 

Y esto es todo. Aunque solo admita un nivel de anidación (salvo extensiones), ya es una gran ayuda para la organización del proyecto.

Deja un comentario