以下是以下资源文件的最佳用法。
- 属性→资源(Phil在DataAnnotation中使用此资源进行本地化)
- App_GlobalResources文件夹
- App_LocalResources文件夹
我还想知道在asp.net mvc应用程序中,(1)和(2)之间的区别是什么。
以下是以下资源文件的最佳用法。
我还想知道在asp.net mvc应用程序中,(1)和(2)之间的区别是什么。
您应避免使用 App_GlobalResources
和 App_LocalResources
。
就像Craig所提到的那样,App_GlobalResources
/App_LocalResources
存在问题,因为您无法在ASP.NET运行时之外访问它们。这会在应用程序单元测试时造成问题,是一个很好的例子。
K. Scott Allen之前在博客中谈到过这个问题。他非常好地解释了在ASP.NET MVC中使用 App_GlobalResources
会出现什么问题,您可以在这里找到相关信息。
如果您采用推荐的方案(即K. Scott Allen博客中的方案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在编译视图时编译的。它们仅在视图中可用。请参见此页面了解全局与本地的区别:链接。
Resources.ResourceInAppToGetAssembly
是什么?它无法编译,我找不到任何关于它的参考,除了这个例子之外?它是您正在使用的实际资源类的代名词吗? - ProfK