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

por Stephen Walther

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

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

Uso de la tabla de rutas predeterminada

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

En primer lugar, ASP.NET Enrutamiento está habilitado en el archivo de configuración web de la aplicación (Web.config archivo). Hay cuatro secciones en el archivo de configuración que son 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 el enrutamiento de estas secciones ya no funcionará.

En segundo lugar, y lo más importante, se crea una tabla de rutas en el archivo Global.asax de la aplicación. El archivo Global.asax es un archivo especial que contiene controladores de eventos para ASP.NET eventos del ciclo de vida de la aplicación. La tabla de rutas 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.

Listado 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 rutas.

La tabla de rutas predeterminada contiene una única 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 = Inicio

  • action = Index

  • id = 3

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

HomeController.Index(3)

La ruta predeterminada incluye los 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 tiene como valor predeterminado 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 del parámetro de ruta Default, escribir esta dirección URL hará que se llame al método Index() de la clase HomeController en listing 2.

Listado 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 el valor del parámetro Id.

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

Listado 3- HomeController.cs (acción de índice 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 Listing 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 listing 4.

Lista 4: HomeController.cs (acción de índice con parámetro que acepta valores 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 acepta valores NULL (puede tener el valor Null), se puede llamar a Index() sin generar un error.

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

Lista 5: HomeController.cs (acción de índice con el parámetro Id)

using System.Web.Mvc;

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

Invocación de una acción de controlador que espera un valor de parámetro

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

La dirección URL /Home/Index/3, por otro lado, funciona bien con la acción Controlador de índice en enumeración 5. La solicitud /Home/Index/3 hace que se llame al método Index() con un parámetro Id que tenga 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 rutas predeterminada que obtiene con una nueva aplicación ASP.NET MVC. Ha aprendido cómo la ruta predeterminada asigna direcciones URL a las acciones del controlador.