Asp.net MVC资源文件的最佳实践

以下资源文件的最佳用法是什么?

  1. 属性 – >资源( Phil在DataAnnotation中使用此资源进行本地化)
  2. App_GlobalResources文件夹
  3. App_LocalResources文件夹

我也想知道(1)和(2)在asp.net mvc应用程序中有什么区别。

谢谢,
Soe Moe

你应该避免App_GlobalResourcesApp_LocalResources 。 就像Craig提到的, App_GlobalResources / App_LocalResources存在问题,因为您无法在ASP.NET运行时之外访问它们。 当你unit testing你的应用程序时,一个很好的例子就是如何解决这个问题。

K.斯科特·艾伦前段时间博客了这个。 他在这里用ASP.NET MVC中的App_GlobalResources解释了这个问题。

如果你采用推荐的解决scheme(1)(即在K. Scott Allen的博客中):

对于那些试图使用显式本地化expression式(又名声明式资源绑定expression式)的人,例如<%$ 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" /> 

属性 – >资源可以在你的视图之外看到,强大的types在你编译你的应用程序时生成。

当你的视图被编译时,App_ *被ASP.NET编译。 他们只在视图中可用。 看到这个页面的全球与本地。