Panoramica del routing di ASP.NET MVC (VB)

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 del browser 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.vb

' Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit https://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

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.

Presentazione 2 - HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As String)
        Return View()
    End Function

End Class

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 il valore Nothing 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.vb (azione indice senza parametro)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        Return View()
    End Function

End Class

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.vb (azione index con parametro nullable)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id? As Integer)
        Return View()
    End Function

End Class

In List 4 il metodo Index() ha un parametro Integer. Poiché il parametro è un parametro nullable (può avere il valore Nothing), è 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.vb (azione index con parametro Id)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As Integer)
        Return View()
    End Function

End Class

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.