ASP.NET MVC 资源文件的最佳实践
-
18-09-2019 - |
题
以下资源文件的最佳用途是什么?
- 属性 → 资源 (菲尔 在 DataAnnotation 中使用此资源进行本地化)
- App_GlobalResources 文件夹
- App_LocalResources文件夹
我还想知道asp.net mvc应用程序中(1)和(2)之间有什么区别。
解决方案
你应该避免 App_GlobalResources
和 App_LocalResources
。正如克雷格提到的,存在以下问题: App_GlobalResources
/App_LocalResources
因为您无法在 ASP.NET 运行时之外访问它们。一个很好的例子说明了当您对应用程序进行单元测试时会出现问题。
K.斯科特·艾伦不久前在博客中谈到了这一点。他很好地解释了这个问题 App_GlobalResources
在 ASP.NET MVC 中 这里.
其他提示
如果您采用推荐的解决方案 (1)(即水槽。斯科特·艾伦的博客):
对于那些尝试使用显式本地化表达式(又名声明性资源绑定表达式)的人,例如 <%$ 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 编译。它们仅在视图中可用。看 这一页 对于全局 vs.当地的。
不隶属于 StackOverflow