2009-12-09 28 views
37

以下资源文件的最佳用法是什么?Asp.net MVC资源文件的最佳实践

  1. 属性 - >资源(Phil使用该资源在DataAnnotation本地化)
  2. App_GlobalResources文件夹
  3. App_LocalResources文件夹

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

感谢,
梭萌

回答

32

您应该避免App_GlobalResourcesApp_LocalResources。 与Craig提到的一样,App_GlobalResources/App_LocalResources存在问题,因为您无法在ASP.NET运行时之外访问它们。这是一个很好的例子,当你单元测试你的应用程序。

K. Scott Allen前段时间在博客上写了一些内容。他在ASP.NET MVC here中用App_GlobalResources解释了问题。

+0

嘿。只是想发布完全相同。奇迹般有效。 :) – 2010-01-15 14:39:19

7

属性 - >资源可以看到你的观点之外,强大的类型,当您编译应用程序生成。

当你的视图被编译时,App_ *被ASP.NET编译。他们只在视图中可用。查看全球与当地的this page

12

如果你用推荐的解决方案(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" /> 
+0

非常感谢!正是我需要的。 – 2011-12-20 16:41:17

+0

这很有趣! – Michael 2012-03-20 18:18:08

+0

什么是'Resources.ResourceInAppToGetAssembly'?它不编译,我找不到任何参考,但在这个例子?它是你使用的实际资源类的化名吗? – ProfK 2015-09-12 07:44:50