Una delle novità introdotte da ASP.NET MVC2 è il concetto di Area, grazie alla quale è possibile partizionare le applicazioni MVC in unità più piccole, fornendo quindi un metodo per suddividere le applicazioni in gruppi funzionali più piccoli.
In applicazioni medio-grandi, questo tipo di suddivisione apporta notevoli benefici in termini di manutenibilità ed estendibilità. Tuttavia, la presenza di controller con nomi uguali in diverse aree funzionali può generare qualche errore.
Ipotizziamo ad esempio di sviluppare un progetto di e-commerce all'interno del quale definiamo diverse aree per diverse categorie merceologiche. Nel nostro esempio creiamo tre distinte categorie: CD, DVD e Libri, ciascuna con un controller Home tramite cui gestire le richieste alla homepage di sezione. Avremo inoltre un controller principale Home relativo alla radice della soluzione. La struttura finale è molto simile a questa.

La solution contiene ben quattro HomeController.cs, ciascuno ovviamente definito in un diverso namespace, ognuno associato ad una route e quindi ad un URL corrispondente:
- localhost/CD/Home
- localhost/DVD/Home
- localhost/Libri/Home
- localhost/Home
Se proviamo a far girare l'applicazione noteremo che, mentre le prime tre route vengono eseguite correttamente, quella riguardante la route principale genera un errore server, dovuto alla presenza di controller con nomi uguali e all'impossibilità di interpretare correttamente la richiesta.

Oltre all'intuitiva soluzione di rinominare il controller principale, in modo da evitare ogni possibile ambiguità, possiamo apportare una modifica alla definizione della route principale, sfruttando un overload del metodo MapRoute che consente di specificare il namespace giusto. Nel file Global.asax quindi aggiungiamo il parametro richiesto:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Nome route "{controller}/{action}/{id}", // URL con parametri new { controller = "Home", action = "Index", id = UrlParameter.Optional } , // Namespace del controller principale new[] { "ControllerNamespace.Controllers" } ); }
Il parametro aggiuntivo consiste in un array di namespace all'interno del quale la route dovrà cercare il controller Home: avendo quindi limitato la ricerca ad un singolo namespace, anche la route principale risponderà correttamente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire dati sensibili nella configurazione in ASP.NET Core
Impostare il tema light o dark utilizzando i CSS
Utilizzare la libreria EntityFrameworkCore.Exceptions per gestire le eccezioni di Entity Framework Core in modo tipizzato
Fare automaticamente il merge di una pull request con un workflow di GitHub
Creare automaticamente una pipeline YAML da una sua definizione in Azure DevOps
Migrare un repository che contiene large file storage objects in GitHub
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Blazor PWA e Offline-First
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Caricare un asset come parte di una release con un workflow di GitHub
Gestire i file esterni in una PWA
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
I più letti di oggi
- DateOnly e TimeOnly in .NET: e io che ci faccio?
- .NET 7 Live Q&A
- Catturare la telemetria degli eventi di output cache in ASP.NET Core
- Nasce DOpsItalia.com: tutto su DevOps e container https://aspit.co/bw3 di @dbochicchio #aspitalia
- il 15/12 torna #netconfit per festeggiare il lancio di #dotnet7.una track live a Milano e 2 in streaming, per un evento ibrido da non perdere!iscrizioni e call for paper su => https://aspit.co/netconf-22
- Utilizzare la modalità serverless con Azure Cosmos DB
- Abilitare automaticamente Dependabot in tutti i repository di una organizzazione su GitHub
- Community Days 'Tour Edition' 2010 - Segrate (MI)
- Rilasciata la preview 1 di ASP.NET AJAX 4.0
- Nuova versione per jQuery e prima alpha per jQuery Mobile