7

È possibile inserire file di risorse (.resx) all'interno di sottocartelle all'interno di App_GlobalResources?Sottocartelle in App_GlobalResources (ASP.NET)

Ad esempio:

/App_GlobalResources/someresources/myfile.resx

/App_GlobalResources/someresources/myfile.fr-fr.resx

/App_GlobalResources/othereresources/otherfile.resx

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

Oppure, sono tutti i file .resx posizionati direttamente all'interno App_GlobalResources?

Se è possibile utilizzare le sottocartelle, come si accede a livello di programmazione alle risorse all'interno delle sottocartelle?

risposta

12

Tecnicamente, sì è possibile ma ci sono alcune insidie. Per prima cosa, lascia che ti mostri un esempio. Supponiamo che la mia cartella App_GlobalResources assomiglia così:

/App_GlobalResources 
    /Test 
     TestSubresource.resx 
    TestResource.resx 

Ogni file risorsa ha una sola voce denominata "TestString". Ho aggiunto ogni file di risorse utilizzando il menu di Visual Studio in modo da creare una classe per me. Per impostazione predefinita, tutte le classi aggiunte alla cartella App_GlobalResources avranno lo stesso spazio dei nomi di Resource. Quindi, se voglio usare il generatore di classi e voglio Test nello spazio dei nomi, ho bisogno di andare nel file TestSubresource.Designer.cs e cambiare manualmente lo spazio dei nomi. Una volta che lo faccio, posso effettuare le seguenti operazioni:

var rootResource = Resources.TestResource.TestString; 
var subResource = Resources.Test.TestSubResource.TestString; 

Posso anche fare riferimento utilizzando GetGlobalResourceObject:

var rootResource = GetGlobalResourceObject("TestResource", "TestString"); 
var subResource1 = GetGlobalResourceObject("TestSubresource", "TestString"); 

Si noti che ho ancora utilizzare il "TestSubresource" come mezzo per fare riferimento le risorse quel file anche se si trova in una sottocartella. Ora, una delle catture, è che tutti i file devono essere univoci in tutte le cartelle in App_GlobalResources o il tuo progetto genererà un errore di runtime. Se posso aggiungere una risorsa denominata "TestResource.resx" per/Test, sarà lanciare il seguente errore di runtime:

The resource file '/App_GlobalResources/TestResource.resx' cannot be used, as it conflicts with another file with the same name.).

Questo è vero anche se cambio lo spazio dei nomi sulla nuova risorsa.

Quindi, in conclusione, sì, è possibile, ma si aumenta la probabilità di ottenere un errore di runtime a causa di due file di risorse con nome identico in diverse parti della struttura della cartella App_GlobalResources consentita dal file system ma non da. NETTO.

1

È possibile. Almeno, sono riuscito a farlo.

All'interno di un sito Web ho aggiunto la cartella App_GlobalResources. Al suo interno ho creato un'altra cartella "MyFolder" e ho inserito il file MyResource.resx all'interno. Il file Resx conteneva una coppia MyKey1 - MyValue1.

Utilizzando il metodo della classe seguente ho estratto con successo "MyValue1" per name = "MyKey1"

static class Class1 { 

    static Assembly FindGlobalResAssembly() { 
     foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { 
      if(asm.FullName.StartsWith("App_GlobalResources.")) 
       return asm; 
     } 
     return null; 
    } 

    public static object GetResource(string name) { 
     Assembly asm = FindGlobalResAssembly(); 
     if(asm == null) 
      return null; 
     return new ResourceManager("Resources.MyResource", asm).GetObject(name); 
    } 

} 

Questo approccio funziona nella fiducia Media anche GetResource.

Sembra che le cartelle non facciano alcuna differenza quando si accede alle risorse dal codice.

Problemi correlati