2009-12-09 31 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