Panoramica del routing di ASP.NET MVC (C#)

di Stephen Walther

In questa esercitazione Stephen Walther illustra come il framework MVC ASP.NET esegue il mapping delle richieste del browser alle azioni del controller.

In questa esercitazione viene introdotta una funzionalità importante di ogni applicazione MVC ASP.NET denominata routing ASP.NET. Il modulo di routing ASP.NET è responsabile del mapping delle richieste in ingresso a determinate azioni del controller MVC. Alla fine di questa esercitazione si apprenderà come la tabella di route standard esegue il mapping delle richieste alle azioni del controller.

Uso della tabella di route predefinita

Quando si crea una nuova applicazione ASP.NET MVC, l'applicazione è già configurata per usare ASP.NET Routing. ASP.NET Routing è configurato in due posizioni.

Prima di tutto, ASP.NET Routing è abilitato nel file di configurazione Web dell'applicazione (Web.config file). Sono disponibili quattro sezioni nel file di configurazione rilevanti per il routing: la sezione system.web.httpModules, la sezione system.web.httpHandlers, la sezione system.webserver.modules e la sezione system.webserver.handlers. Prestare attenzione a non eliminare queste sezioni perché senza il routing di queste sezioni non funzionerà più.

In secondo luogo, e più importante, viene creata una tabella di route nel file Global.asax dell'applicazione. Il file Global.asax è un file speciale che contiene gestori eventi per ASP.NET eventi del ciclo di vita dell'applicazione. La tabella di route viene creata durante l'evento Application Start.

Il file nell'elenco 1 contiene il file Global.asax predefinito per un'applicazione MVC ASP.NET.

Elenco 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);
        }
    }
}

Quando viene avviata prima un'applicazione MVC, viene chiamato il metodo Application_Start(). Questo metodo, a sua volta, chiama il metodo RegisterRoutes(). Il metodo RegisterRoutes() crea la tabella di route.

La tabella di route predefinita contiene una singola route (denominata Default). La route predefinita esegue il mapping del primo segmento di un URL a un nome controller, al secondo segmento di un URL di un'azione controller e al terzo segmento a un parametro denominato ID.

Si supponga di immettere l'URL seguente nella barra degli indirizzi del Web browser:

/Home/Index/3

La route predefinita esegue il mapping di questo URL ai parametri seguenti:

  • controller = Home

  • action = Indice

  • id = 3

Quando si richiede l'URL /Home/Index/3, viene eseguito il codice seguente:

HomeController.Index(3)

La route predefinita include le impostazioni predefinite per tutti e tre i parametri. Se non si specifica un controller, il parametro controller viene predefinito per il valore Home. Se non si specifica un'azione, il parametro azione viene impostato per impostazione predefinita sul valore Index. Infine, se non si specifica un ID, il parametro ID viene predefinito in una stringa vuota.

Ecco alcuni esempi di come gli URL di route predefiniti vengono mappati alle azioni del controller. Si supponga di immettere l'URL seguente nella barra degli indirizzi del browser:

/Casa

A causa dei valori predefiniti del parametro di route Predefinita, l'immissione di questo URL causerà la chiamata del metodo Index() della classe HomeController in List 2.

Elenco 2 - HomeController.cs

using System.Web.Mvc;

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

In List 2 la classe HomeController include un metodo denominato Index() che accetta un singolo parametro denominato ID. L'URL /Home causa la chiamata del metodo Index() con una stringa vuota come valore del parametro Id.

A causa del modo in cui il framework MVC richiama le azioni del controller, l'URL /Home corrisponde anche al metodo Index() della classe HomeController in List 3.

Elenco 3 - HomeController.cs (azione index senza parametro)

using System.Web.Mvc;

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

Il metodo Index() in List 3 non accetta parametri. L'URL /Home causerà la chiamata del metodo Index(). L'URL /Home/Index/3 richiama anche questo metodo (l'ID viene ignorato).

L'URL /Home corrisponde anche al metodo Index() della classe HomeController in List 4.

Elenco 4 - HomeController.cs (azione index con parametro nullable)

using System.Web.Mvc;

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

In List 4 il metodo Index() ha un parametro Integer. Poiché il parametro è un parametro nullable (può avere il valore Null), è possibile chiamare Index() senza generare un errore.

Infine, richiamando il metodo Index() in List 5 con l'URL /Home viene generata un'eccezione poiché il parametro Id non è un parametro nullable. Se si tenta di richiamare il metodo Index(), viene visualizzato l'errore nella figura 1.

Elenco 5 - HomeController.cs (azione index con parametro Id)

using System.Web.Mvc;

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

Richiamare un'azione del controller che prevede un valore di parametro

Figura 01: richiamare un'azione del controller che prevede un valore di parametro (Fare clic per visualizzare l'immagine full-size)

L'URL /Home/Index/3, invece, funziona correttamente con l'azione del controller di indice nell'elenco 5. La richiesta /Home/Index/3 causa la chiamata del metodo Index() con un parametro Id con il valore 3.

Riepilogo

L'obiettivo di questa esercitazione è stato fornire una breve introduzione a ASP.NET Routing. È stata esaminata la tabella di route predefinita che si ottiene con una nuova applicazione MVC ASP.NET. Si è appreso come gli URL di route predefiniti vengono mappati alle azioni del controller.