Información general sobre el enrutamiento de ASP.NET MVC (C#)

por Stephen Walther

En este tutorial, Stephen Walther muestra cómo el marco ASP.NET MVC asigna las solicitudes del explorador a las acciones del controlador.

En este tutorial, se le presenta una característica importante de cada aplicación ASP.NET MVC denominada Enrutamiento de ASP.NET. El módulo de Enrutamiento de ASP.NET se encarga de asignar las solicitudes entrantes a acciones de controlador de MVC concretas. Al final de este tutorial, comprenderá cómo la tabla de enrutamiento estándar asigna las solicitudes a las acciones del controlador.

Uso de la tabla de enrutamiento predeterminada

Al crear una nueva aplicación ASP.NET MVC, la aplicación ya está configurada para usar el Enrutamiento de ASP.NET. El Enrutamiento de ASP.NET está configurado en dos lugares.

En primer lugar, el Enrutamiento de ASP.NET está habilitado en el archivo de configuración web de la aplicación (archivo Web.config). Hay cuatro secciones en el archivo de configuración relevantes para el enrutamiento: la sección system.web.httpModules, la sección system.web.httpHandlers, la sección system.webserver.modules y la sección system.webserver.handlers. Tenga cuidado de no eliminar estas secciones porque sin ellas, el enrutamiento no funcionará.

En segundo lugar, y lo más importante, se crea una tabla de enrutamiento en el archivo Global.asax de la aplicación. El archivo Global.asax es un archivo especial que contiene controladores de eventos para los eventos de ciclo de vida de la aplicación ASP.NET. La tabla de enrutamiento se crea durante el evento Application Start.

El archivo de la lista 1 contiene el archivo Global.asax predeterminado para una aplicación ASP.NET MVC.

Lista 1: Global.asax.cs

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

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        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 = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Cuando se inicia una aplicación MVC por primera vez, se llama al método Application_Start(). Este método, a su vez, llama al método RegisterRoutes(). El método RegisterRoutes() crea la tabla de enrutamiento.

La tabla de enrutamiento predeterminada contiene una sola ruta (denominada Default). La ruta predeterminada asigna el primer segmento de una dirección URL a un nombre de controlador; el segundo segmento de una dirección URL, a una acción de controlador y el tercer segmento, a un parámetro denominado id.

Imagine que escribe la siguiente dirección URL en la barra de direcciones del explorador web:

/Home/Index/3

La ruta predeterminada asigna esta dirección URL a los parámetros siguientes:

  • controller = Home

  • action = Index

  • id = 3

Al solicitar la dirección URL /Home/Index/3, se ejecuta el código siguiente:

HomeController.Index(3)

La ruta predeterminada incluye valores predeterminados para los tres parámetros. Si no proporciona un controlador, el parámetro del controlador tiene como valor predeterminado el valor Home. Si no proporciona una acción, el parámetro action se establece de forma predeterminada en el valor Index. Por último, si no proporciona un identificador, el parámetro id tiene como valor predeterminado una cadena vacía.

Echemos un vistazo a algunos ejemplos de cómo la ruta predeterminada asigna las direcciones URL a las acciones del controlador. Imagine que escribe la siguiente dirección URL en la barra de direcciones del explorador:

/Home

Debido a los valores predeterminados de los parámetros de ruta predeterminados, escribir esta dirección URL hará que se llame al método Index() de la clase HomeController de la lista 2.

Lista 2: HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
}

En la lista 2, la clase HomeController incluye un método denominado Index() que acepta un único parámetro denominado Id. La dirección URL /Home hace que se llame al método Index() con una cadena vacía como valor del parámetro Id.

Debido a la forma en que el marco de MVC invoca acciones de controlador, la dirección URL /Home también coincide con el método Index() de la clase HomeController en la lista 3.

Lista 3: HomeController.cs (acción Index sin parámetro)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

El método Index() de la lista 3 no acepta ningún parámetro. La dirección URL /Home hará que se llame a este método Index(). La dirección URL /Home/Index/3 también invoca este método (se omite el identificador).

La dirección URL /Home también coincide con el método Index() de la clase HomeController en la lista 4.

Lista 4: HomeController.cs (acción Index con parámetro que admite un valor NULL)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

En la lista 4, el método Index() tiene un parámetro Integer. Dado que el parámetro es un parámetro que admite un valor NULL (puede tener el valor Null), se puede llamar a Index() sin generar un error.

Por último, invocar el método Index() en la lista 5 con la dirección URL /Home provoca una excepción, ya que el parámetro Id no es un parámetro que admite un valor NULL. Si intenta invocar el método Index(), obtendrá el error mostrado en la figura 1.

Lista 5: HomeController.cs (acción Index con parámetro de id.)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}

Invoking a controller action that expects a parameter value

Figura 01: Invocar una acción de controlador que espera un valor de parámetro (haga clic para ver la imagen a tamaño completo)

La dirección URL /Home/Index/3, por otro lado, funciona bien con la acción de controlador de Index en la lista 5. La solicitud /Home/Index/3 hace que se llame al método Index() con un parámetro Id que tiene el valor 3.

Resumen

El objetivo de este tutorial era proporcionarle una breve introducción al enrutamiento de ASP.NET. Hemos examinado la tabla de enrutamiento predeterminada que se obtiene con una nueva aplicación ASP.NET MVC. Hemos aprendido cómo el enrutamiento predeterminado asigna las direcciones URL a las acciones del controlador.