How to fix: Impossibile trovare i file di risorse per questa pagina. Verificare che il file di risorse esista e riprovare

Giorgio Borelli

Pagina con l'eccezione Impossibile trovare la classe di risorse per questa pagina

Se vi si è sollevata questa eccezione, e ricevete il messaggio d'errore "Impossibile trovare la classe di risorse per questa pagina" il problema risiede in una errata gestione dei file di risorse di ASP.NET. Risolvere l'eccezione è molto semplice, vediamo come funzionano i file di risorse con estensione .resx e prevenire così il generarsi di questa eccezione a run-time.

I file di risorse in ASP.NET vengono usati per la localizzazione, ovvero per la gestione del multilingua negli applicativi. I file di risorse presentano una estensione .resx ma non sono altro che dei file XML nei quali andare ad inserire dei valori corrispondenti a delle chiavi, in pratica la classica accoppiata chiave valore.

Il motore di ASP.NET, ed in particolar modo se ci riferiamo ad applicazioni web multilingua è in grado di riconoscere la culture del browser che stà navigando il sito, sempre ammesso che i file di risorse siano stati specificati correttamente, questi infatti devono essere definiti uno per ogni lingua che intendiamo gestire, ed il loro nome deve terminare con il codice ISO identificativo della lingua e poi seguito dall'estensione, se vogliamo trattare quindi la lingua spagnola, avremo NomeFileRisorse.es.resx per il francese diventa NomeFileRisorse.fr.resx, l'unica eccezione rappresenta la lingua di default, che viene automaticamente individuata poichè per tali file di risorse detti fallback non viene specificato il codice ISO nel nome, quindi se per noi la lingua di default è l'italiano, per tutti i file inerenti questa lingua scriveremo semplicemente NomeFileRisorse.resx. Definire i file di risorse per la lingua di default consente anche di prevenire possibili eccezioni dovuti alla navigazione con browser da parte di paesi per i quali non avevamo previsto la risorsa adeguata, in questo caso viene sempre mostrata la lingua di default.

Tale comportamento può essere espressamente definito nel web.congif, nel quale andiamo a dire come gestire la globalizzazione e quale deve essere la lingua di default, dentro il nodo system.web in questo modo:

<globalization culture="auto:it" uiCulture="auto:it" requestEncoding="utf-8" responseEncoding="utf-8" />

stiamo dicendo alla nostra applicazione web che la culture deve essere gestita in modo automatico e che la lingua di default eventualmente è l'italiano, pertanto se il nostro sito viene navigato da un inglese con le impostazioni del browser per la culture inglese, automaticamente lo visualizzerà in lingua inglese (se prevista), senza bisogno di passare manualmente alla selezione della lingua come avviene in molti siti che ci presentano la classica scelta della lingua.

I file di risorse per la globalizzazione possono essere creati e salvati in due cartelle particolari per gli applicativi web in ASP.NET, una per gestire le risorse a livello globale ed uno a livello locale, queste sono rispettivamente App_GlobalResources e App_LocalResources. Creando queste cartelle vengono automaticamente riconosciute da Visual Studio come dedicate alla gestione dei file di risorse.

Nella cartella global inseriamo tutte quelle risorse (chiave/valore) utili a livello globale, ad es. se vogliamo definire l'anchor text per il link "Torna alla home" possiamo farlo a livello globale poichè ci servirà in diversi punti del sito,  mentre del testo o delle label appartenenti ad una specifica pagina, è meglio definirle a livello locale.

I file di risorse a livello locale si definiscono nominando il file con lo stesso nome della pagina o del controllo nella quale devono essere usate, se pertanto abbiamo necessità di definire una risorsa per la nostra pagina home, la Default.aspx, andremo ad inserire all'interno della cartella App_LocalResources un file .resx che abbia come nome proprio quello della pagina, quindi in questo modo Default.aspx.resx, questo file conterrà pertanto le chiave/valore delle risorse della lingua di default della pagina Default.aspx e dobbiamo inoltre crearne altri per tutte le altre lingue che intendiamo gestire, tipo Default.aspx.es.resx per lo spagnolo e Default.aspx.en.resx per l'nglese; quando poi nel codice della pagina (o nel markup stesso) invochiamo la risorsa, automaticamente sarà selezionata quella corretta in base alla culture corrente.

 

Questa breve introduzione sulla globalizzazione e sui file di risorse di ASP.NET era necessaria per avvicinarci e comprendere meglio il nostro problema, ossia il sollevarsi dell'eccezione "Impossibile trovare i file di risorse per questa pagina. Verificare che il file di risorse esista e riprovare", come detto se stiamo usando i file di risorse locali e dentro il codebehind per prelevare un valore dalla risorsa inseriamo un qualcosa del genere:

GetLocalResourceObject("successed").ToString();

con questo comando diciamo alla pagina aspx di prendere il valore corrispondente alla chiave "successed" dal file di risorse locale adeguato alla culture corrente, dobbiamo pertanto stare attenti che le risorse locali siano definite correttamente, e che siano anche previsti i file di risorse per la lingua di default (evitano che una richiesta per una culture non prevista sollevi l'eccezione). La causa che scatena l'eccezione, è la mancanza del file di risorse adeguato, e preciso adeguato, poichè è possibile che per noi sia stato creato e definito, ma se a run-time si solleva quella eccezione vuol dire che sicuramente c'è qualcosa di sbagliato nel nome o manca del tutto, quindi suggerisco di controllare per bene i file di risorse locali seguendo questi passaggi:

  • assicurarsi che sia definito un file di risorsa con lo stesso identico nome della pagina (classe) per ogni lingua da gestire;
  • assicurarsi che il codice iso per la lingua sia stato specificato e che sia corretto;
  • assicurarsi di aver definito i fallback, ossia i file di risorse per la lingua di default, che non necessitano dell'aggiunta del codice ISO della culture.

Banalmente, un semplice errore di battitura nella scrittura del nome del file di risorsa può portare al generarsi dell'eccezione, la cosa brutta è che a compile-time questa non viene rilevata e si manifesta solo in fase di esecuzione al momento della richiesta della risorsa per un file non definito o non esistente, sul più bello, quando meno ce lo aspettiamo, vediamo così crashare la nostra bellissima applicazione web multilingua, senza capirne il perchè attenzione quindi a nominare sempre per bene i file di risorse di asp.net ed a prevedere sempre quelli di default.

 

Chiunque voglia aggiungere qualcosa o chiedere ulteriori chiarimenti sul sollevarsi dell'eccezione System.InvalidOperationException con il messaggio "Impossibile trovare i file di risorse per questa pagina. Verificare che il file di risorse esista e riprovare", può farlo tramite i commenti, ogni vostro contributo alla discussione sarà gradito e contribuirà ad un approfondimente per una crescita comune.

Categorie: ASP.NET | fix

Tags: , , ,

Commenti (2) -

ogni volta che faccio il debug su visual studio express 2013 for web mi da questo errore, aiutooooo:

Errore server nell'applicazione '/'.

Impossibile trovare la risorsa.

Descrizione: HTTP 404. La risorsa che si sta cercando (o una delle sue dipendenze) potrebbe essere stata rimossa, rinominata o non essere temporaneamente disponibile. Verificare che l'URL riportato di seguito sia stato digitato correttamente.

URL richiesto: /

Informazioni di versione: Versione di Microsoft .NET Framework:4.0.30319; Versione di ASP.NET:4.0.30319.34212

Rispondi

Beh! Così e come trovare un ago in un pagliaio, le motivazioni potrebbero essere molteplici.

Questo errore centra poco con i file di risorse, ma sarebbe opportuno capire alcune cosette;
L'errore te lo da a compile time? A me questo messagio sembra più un errore da run time.
In quale punto del codice dà l'errore, potresti postarlo?

Cmq in ogni caso è un errore 404, una risorsa/pagina non trovata, controlla i giusti percorsi (path) e che IIS sia configurato correttamente e che il tuo progetto sia configurato come application web.

Se così non risolvi, prova a postare informazioni più precise e vediamo se riusciamo a cavarne qualcosa, ciao.

Rispondi

Aggiungi Commento

biuquote
Loading