App_GlobalResourcesでサブフォルダ(ASP.NET)
-
23-09-2019 - |
質問
App_GlobalResources内のサブフォルダ内のリソースファイル(.resxファイル)を配置することは可能ですか?
例えば、
/App_GlobalResources/someresources/myfile.resx
/App_GlobalResources/someresources/myfile.fr-fr.resx
/App_GlobalResources/othereresources/otherfile.resx
/App_GlobalResources/othereresources/otherfile.fr-fr.resx
それとも、App_GlobalResources?
内に直接配置されるすべての.resxファイルですそれはサブフォルダを使用することが可能である場合は、サブフォルダ内あなたのプログラムからアクセスリソースをどうすればよいですか?
解決
技術的には、はい、それは可能ですが、いくつかの落とし穴があります。まず、私はあなたに例を示しましょう。ルックスがとても好きなフォルダに私App_GlobalResources
を仮定します:
/App_GlobalResources
/Test
TestSubresource.resx
TestResource.resx
各リソースファイルには、「たTestString」と呼ばれる単一のエントリーがあります。それは私のためにクラスを作成しましたので、私は、Visual Studioのメニューを使用して、各リソースファイルを追加しました。デフォルトでは、App_GlobalResources
フォルダに追加されたすべてのクラスがResource
の同じ名前空間を持つことになります。私はクラスの発電機を使用したいと私は名前空間にTest
をしたいのであれば、私はTestSubresource.Designer.csファイルに移動して、手動で名前空間を変更する必要があります。私はそれを行うならば、私は次の操作を行うことができます:
var rootResource = Resources.TestResource.TestString;
var subResource = Resources.Test.TestSubResource.TestString;
私もGetGlobalResourceObject
を使用してそれらを参照することができます:
var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );
私はまだそれがサブフォルダにあるにもかかわらず、そのファイル内のリソースを参照するための手段として「TestSubresource」を使用することをに注意してください。さて、キャッチの一つは、ランタイムエラーをスローしますすべてのファイルがApp_GlobalResources
またはプロジェクト内のすべてのフォルダで一意でなければならないということです。私は/テストに「TestResource.resx」という名前のリソースを追加した場合、それは、次のランタイムエラーがスローされます。
リソースファイル「/App_GlobalResources/TestResource.resxは」にすることはできません それは、同じ名前を持つ別のファイルと競合するとして、使用していました。)。
これは私が新しいリソースの名前空間を変更する場合でも同じです。
そうは、結論で、はい、それは可能ですが、理由は、.NETによって、ファイルシステムで許可されていないが、App_GlobalResources
フォルダ構造の異なる部分に2つの同じ名前のリソースファイルの実行時のエラーを取得する確率を高めますます。
他のヒント
それは可能です。少なくとも、私はそれを行うために管理します。
ウェブサイト内では、私はApp_GlobalResourcesフォルダを追加しました。その中に私は別のフォルダ「はMyFolder」と置かれMyResource.resxファイルの内部を作成しました。 RESXファイルは、1つのペアMyKey1が含まれて - 。MyValue1
私は成功した名前を「MyValue1」を抽出し、次のクラスのGetResource
メソッドを使用して=「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);
}
}
このアプローチはまた、中型の信頼で動作します。
これはコードからリソースにアクセスする際にフォルダが違いはありませんと思われます。