次のリソース ファイルの最適な使用法は何ですか。
- プロパティ → リソース ( Philは DataAnnotation でのローカライズにこのリソースを使用しました)
- App_GlobalResources フォルダー
- App_LocalResources フォルダー
asp.net mvc アプリケーションの (1) と (2) の違いも知りたいです。
次のリソース ファイルの最適な使用法は何ですか。
asp.net mvc アプリケーションの (1) と (2) の違いも知りたいです。
とを避ける必要がApp_GlobalResources
ありApp_LocalResources
ます。Craigが述べたように、ASP.NETランタイムの外部ではアクセスできないため、 App_GlobalResources
/に問題があります。App_LocalResources
これがどのように問題になるかを示す良い例は、アプリを単体テストする場合です。
K.スコットアレンは少し前にこれについてブログを書きました。彼はここApp_GlobalResources
でASP.NETMVCの問題をうまく説明しています。
推奨される解決策 (1) を使用する場合 (つまり、K. Scott Allen のブログのように):
明示的なローカライゼーション式 (別名、宣言型リソース バインディング式) を使用しようとしている場合は、次のようになります。<%$ Resources, MyResource:SomeString %>
public class AppResourceProvider : IResourceProvider
{
private readonly string _ResourceClassName;
ResourceManager _ResourceManager = null;
public AppResourceProvider(string className)
{
_ResourceClassName = className;
}
public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
{
EnsureResourceManager();
if (culture == null)
{
culture = CultureInfo.CurrentUICulture;
}
return _ResourceManager.GetObject(resourceKey, culture);
}
public System.Resources.IResourceReader ResourceReader
{
get
{
// Not needed for global resources
throw new NotSupportedException();
}
}
private void EnsureResourceManager()
{
var assembly = typeof(Resources.ResourceInAppToGetAssembly).Assembly;
String resourceFullName = String.Format("{0}.Resources.{1}", assembly.GetName().Name, _ResourceClassName);
_ResourceManager = new global::System.Resources.ResourceManager(resourceFullName, assembly);
_ResourceManager.IgnoreCase = true;
}
}
public class AppResourceProviderFactory : ResourceProviderFactory
{
// Thank you, .NET, for providing no way to override global resource providing w/o also overriding local resource providing
private static Type ResXProviderType = typeof(ResourceProviderFactory).Assembly.GetType("System.Web.Compilation.ResXResourceProviderFactory");
ResourceProviderFactory _DefaultFactory;
public AppResourceProviderFactory()
{
_DefaultFactory = (ResourceProviderFactory)Activator.CreateInstance(ResXProviderType);
}
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
return new AppResourceProvider(classKey);
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
return _DefaultFactory.CreateLocalResourceProvider(virtualPath);
}
}
次に、これを web.config に追加します。
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
プロパティ → リソースはビューの外に表示され、アプリケーションをコンパイルすると強力な型が生成されます。
ビューがコンパイルされると、App_* は ASP.NET によってコンパイルされます。ビューでのみ使用できます。グローバルとローカルについては、このページを参照してください。