7

Ist es möglich, Ressourcendateien (.resx) in Unterordnern in App_GlobalResources zu platzieren?Unterordner in App_GlobalResources (ASP.NET)

Zum Beispiel:

/App_GlobalResources/someresources/myfile.resx

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

/App_GlobalResources/othereresources/otherfile.resx

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

Oder sind alle RESX-Dateien direkt in App_GlobalResources platziert?

Wenn es möglich ist, Unterordner zu verwenden, wie greifen Sie programmgesteuert auf Ressourcen in Unterordnern zu?

Antwort

12

Technisch ja ist es möglich, aber es gibt einige Fallstricke. Lassen Sie mich zuerst ein Beispiel zeigen. Angenommen, mein App_GlobalResources Ordner sieht so aus:

/App_GlobalResources 
    /Test 
     TestSubresource.resx 
    TestResource.resx 

Jede Ressource-Datei hat einen einzigen Eintrag namens „Teststring“. Ich habe jede Ressourcendatei über das Visual Studio-Menü hinzugefügt, sodass eine Klasse für mich erstellt wurde. Standardmäßig haben alle Klassen, die zum Ordner App_GlobalResources hinzugefügt wurden, denselben Namensraum wie Resource. Also, wenn ich den Klassengenerator verwenden möchte und ich Test im Namespace will, muss ich in die Datei TestSubresource.Designer.cs gehen und den Namespace manuell ändern. Sobald ich das tun, kann ich folgendes tun:

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

ich auch sie GetGlobalResourceObject mit verweisen können:

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

Beachten Sie, dass ich die „TestSubresource“ immer noch als Mittel verwenden, um die Ressourcen Bezug nimmt in Diese Datei befindet sich zwar in einem Unterordner. Nun, einer der Haken ist, dass alle Dateien in allen Ordnern in App_GlobalResources eindeutig sein müssen oder Ihr Projekt wird einen Laufzeitfehler auslösen. Wenn ich eine Ressource mit dem Namen „TestResource.resx“ zu/Test hinzufügen, wird es die folgenden Laufzeitfehler werfen:

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

Dies gilt auch dann, wenn ich den Namespace auf die neue Ressource ändern.

Also, abschließend, ja, es ist möglich, aber Sie erhöhen die Chancen, einen Laufzeitfehler wegen zwei identisch benannten Ressourcen-Dateien in verschiedenen Teilen der App_GlobalResources Ordnerstruktur, die durch das Dateisystem, aber nicht durch erlaubt ist. NETZ.

1

Es ist möglich. Zumindest habe ich es geschafft.

Innerhalb einer Website habe ich den Ordner App_GlobalResources hinzugefügt. Darin habe ich einen anderen Ordner "MyFolder" erstellt und die Datei MyResource.resx darin platziert. Resx-Datei enthielt ein Paar MyKey1 - MyValue1.

die GetResource Methode der folgenden Klasse verwenden I "MyValue1" für name = "MyKey1" erfolgreich extrahiert

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); 
    } 

} 

Dieser Ansatz auch in Mittel Vertrauen funktioniert.

Es scheint, dass Ordner beim Zugriff auf Ressourcen aus Code keinen Unterschied machen.

Verwandte Themen