ASP.NET MVC – Aggiungere uno o più percorsi di ricerca predefiniti per le View

Errore 403 - forbidden dopo aver pubblicato una applicazione ASP.NET MVC su IIS 7: come risolvere

Una delle cose maggiormente apprezzabili del modello di sviluppo MVC (se non sapete cos’è, leggete qui) è l’importanza data all’organizzazione del codice: la separazione logica dei tre aspetti di cui si compone l’applicazione si concretizza all’interno delle directory del progetto: in particolare, visto che il Model è spesso delegato a librerie esterne e relativi abstraction layers, alle cartelle /Controllers/ e /Views/, che ospitano rispettivamente gli input handler e la user interface dell’applicazione.

Tra queste, la cartella /Views/ riveste una particolare importanza a livello di filesystem in quanto viene utilizzata dal View Engine per reperire automaticamente le viste richiamate dai nostri Controller. Questa ricerca viene effettuata attraverso un insieme di percorsi di ricerca predefiniti che costituiscono il cosiddetto default location scheme. Si tratta in buona sostanza di un elenco di pattern di ricerca relativi a percorsi locali. Quella che segue è la parte del default location scheme del Razor View Engine relativa alle normali View:

Se volete dare un’occhiata al location scheme completo, che include anche i default pattern per le Partial Views, Area Views, Master Views et. al., potete farlo tramite questa pagina.

Tornando alla porzione riportata in alto, è possibile notare due placeholder{0} e {1}, che si riferiscono rispettivamente al nome della Action e del relativo Controller. Il funzionamento è del tutto evidente: il View Engine controlla la presenza di una vista compatibile nei percorsi più comuni, dando la priorità ai path più specifici e quindi cercando in quello convenzionalmente dedicato alle viste condivise.

La domanda, a questo punto, nasce spontanea: come possiamo fare ad aggiungere altre convenzioni? O meglio, come possiamo modificare quella lista, magari aggiungendo una o più cartelle compatibili con la logica che abbiamo deciso di adottare per creare il nostro albero di cartelle in cui organizzare le View? E’ infatti evidente che, se non troviamo il modo di farlo, qualsiasi tentativo di organizzare le nostre View in modo non conforme a quanto previsto da ASP.NET si tradurrà nel seguente messaggio di errore:

The view ‘YourView’ or its master was not found or no view engine supports the searched locations. The following locations were searched:

error-view-engine

Le risposte più comuni che si trovano in rete propongono soluzioni piuttosto complesse da implementare, come creare un nuovo View Engine estendendo il RazorViewEngine o il WebFormViewEngine, riscrivere la collection   e altri approcci non esattamente developer-friendly.

Fortunatamente, esiste un metodo estremamente semplice che consente di modificare il location scheme predefinito con pochissime righe di codice e senza creare o estendere nessuna classe: è sufficiente aggiungere le seguenti righe al metodo Application_Start del Global.asax:

L’esempio sopra indicato aggiunge una cartella (con o senza Controller) ai percorsi di ricerca predefiniti previsti per le View e per le Partial View con un impatto estremamente contenuto sul nostro progetto. E’ ovviamente possibile aggiungere un qualsiasi numero di cartelle a questi due array e/o a qualsiasi altro gruppo relativo alle varie tipologie di View. Per un elenco completo, potete fare riferimento alla pagina già menzionata poco fa.

Per il momento è tutto: felice sviluppo!

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.