次のリソースファイルの最適な使用方法は何ですか。
また、asp.net mvcアプリケーションの(1)と(2)の違いを知りたいと思います。
App_GlobalResources
とApp_LocalResources
は避けてください。 Craigが述べたように、App_GlobalResources
/App_LocalResources
には問題があります。これは、ASP.NETランタイムの外部ではアクセスできないためです。これがどのように問題になるかを示す良い例は、アプリを単体テストするときです。
K. Scott Allenがこのことについて少し前にブログに書いた。彼は、ASP.NET MVCのApp_GlobalResources
の問題をうまく説明しています here 。
推奨される解決策(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によってコンパイルされます。ビューでのみ使用できます。グローバルとローカルについては、 このページ を参照してください。