En ciertas ocasiones cuando un proyecto se vuelve grande y posee muchos controladores, es conveniente agrupar los controlados, vistas y modelos dependiendo a qué contexto pertenecen, bajo este criterio aparecen las Áreas.

Un Área es un conjunto de controladores, con sus vistas y modelos que utiliza, pertenecientes a un contexto. Este contexto podrían ser todas las páginas de configuración del sitio bajo el nombre Admin o todas las páginas que administran un perfil de un usuario con el nombre Profile

Un Área posee impacto en la Url de la página con un prefijo justo después del dominio. Como por ejemplo si se tiene un Área llamada Admin, que a su vez posee un controlador llamado Home y una acción llamada Index para acceder a dicha acción la Url sería dominio/Admin/Home/Index

Agregar un Área

Para agregar un Área se hace click con el botón secundario del mouse sobre el proyecto, y se selecciona la opción “Agregar -> Área…”

Luego nos pedirá que ingresemos el nombre del Área y hacemos click en Agregar

Al finalizar nos queda una estructura como la siguiente

Al crearse el Área, crea una serie de carpetas para los controladores, los modelos y las vistas. Posee su propia carpeta Views/Shared para los Layouts y vistas de uso común dentro del Área. Ademas posee su propio web.config para configurar los accesos al Área, como tipo de autenticación o connectionString por si se conecta a bases de datos diferentes a las demás Áreas.

Por otro lado posee una clase llamada AdminAreaRegistration, que nos permite configurar el Área como por ejemplo el mapeo de rutas que lo hace de la misma manera que la clase App_Start/Route_Config

using System.Web.Mvc;

namespace Comercio.Areas.Admin
{
    public class AdminAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Admin";
            }
        }

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

Por defecto el Área se crea vacía, sin controladores, ni vistas ni modelos. Para agregar un controlador hacemos click con el botón secundario del mouse sobre la carpeta Controllers dentro del Área que creamos y seleccionamos la opción “Agregar -> Controlador…”

En la ventana que aparece elegimos la opción “Controlador de MVC 5: en blanco” y hacemos click en agregar

Luego ingresamos el nombre del controlador, como por ejemplo DefaultController

Cuando finalice nos queda el siguiente código

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

namespace Comercio.Areas.Admin.Controllers
{
    public class DefaultController : Controller
    {
        // GET: Admin/Default
        public ActionResult Index()
        {
            return View();
        }
    }
}

Si bien el asistente crea la acción Index pero no crea la vista de esta acción. Para agregar la vista de la acción hacemos click con el botón secundario del mouse sobre la carpeta Areas/Admin/Views/Default y seleccionamos la opción “Agregar -> Vista…”

Luego ingresamos el nombre de la vista

Al finalizar modificamos el código de la vista

@{
    ViewBag.Title = "Area Admin";
}

<h2>Inicio Area Admin</h2>

Al ejecutar y dirigirnos hacia el área Admin, el controlador Default y la acción Index nos mostrará la siguiente pantalla

Por otro lado si ingresamos al área Admin sin especificar controlador ni acción nos devuelve error

Algo muy distinto a lo que sucede si ingresamos a localhost sin especificar controlador ni acción, donde accede al controlador Home y acción Index debido a que se encuentra configurado en la clase App_Start/Route_Config por defecto.

Para configurar controlador y acción por defecto en el área Admin modificamos la clase Areas/Admin/AdminAreaRegistration en la función RegisterArea y especificamos el controller en el parámetro “defaults” (tercer parámetro) de context.MapRoute() que inicialmente no lo especifica

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Default", action = "Index", id = UrlParameter.Optional }
    );
}

Al especificar el controlador por defecto ya no devuelve error al ingresar al área Admin sin especificar controlador ni acción