ベスト実践のためのASP.NET MVCリソースファイル
-
18-09-2019 - |
質問
何が最高使用の以下の資源ファイルです。
- 物件→資源フィル この資源の局在にDataAnnotation)
- App_GlobalResourcesフォルダ
- App_LocalResourcesフォルダ
もう何が違(1)(2)asp.net mvcます。
解決
あなたはApp_GlobalResources
とApp_LocalResources
を避ける必要があります。
クレイグが述べたようにあなたは、ASP.NETランタイムの外でそれらにアクセスすることはできませんので、App_GlobalResources
/ App_LocalResources
に問題があります。アプリをテストするユニットだとき、これが問題となるかの良い例があります。
K。スコット・アレンは、しばらく前にこのブログについて。彼は、ASP.NET MVC <のhref = "http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-netにApp_GlobalResources
に問題があることを説明するのは良い仕事をしていませんここを-mvc-projects.aspx」のrel = "nofollowをnoreferrer">。
他のヒント
あなたが推奨される解決策(1)(すなわち、K.スコット・アレンのブログのように)で行く場合:
例えば、明示的なローカリゼーション式(式を結合別名宣言型リソース)を使用しようとしているあなたのそれらのために<%$ 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によってコンパイルされます。彼らは、ビューでのみ使用可能です。ローカル対グローバルのためのこのページを参照してください。