以下资源文件的最佳用法是什么?Asp.net MVC资源文件的最佳实践
- 属性 - >资源(Phil使用该资源在DataAnnotation本地化)
- App_GlobalResources文件夹
- App_LocalResources文件夹
我也想知道是什么区别(1)和(2)在asp.net mvc应用程序中。
感谢,
梭萌
以下资源文件的最佳用法是什么?Asp.net MVC资源文件的最佳实践
我也想知道是什么区别(1)和(2)在asp.net mvc应用程序中。
感谢,
梭萌
您应该避免App_GlobalResources
和App_LocalResources
。 与Craig提到的一样,App_GlobalResources
/App_LocalResources
存在问题,因为您无法在ASP.NET运行时之外访问它们。这是一个很好的例子,当你单元测试你的应用程序。
K. Scott Allen前段时间在博客上写了一些内容。他在ASP.NET MVC here中用App_GlobalResources
解释了问题。
属性 - >资源可以看到你的观点之外,强大的类型,当您编译应用程序生成。
当你的视图被编译时,App_ *被ASP.NET编译。他们只在视图中可用。查看全球与当地的this page。
如果你用推荐的解决方案(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" />
嘿。只是想发布完全相同。奇迹般有效。 :) – 2010-01-15 14:39:19