2009-12-09 27 views
37

Was sind die folgenden Ressourcen-Dateien am besten zu verwenden.Best Practice für Asp.net MVC-Ressourcendateien

  1. Eigenschaften -> Ressourcen (Phil diese Ressource für die Lokalisierung in DataAnnotation verwendet)
  2. App_GlobalResources Ordner
  3. App_LocalResources Ordner

Ich würde auch gerne wissen, was ist der Unterschied zwischen (1) und (2) in asp.net mvc-anwendung.

Danke,
Soe Moe

Antwort

32

Sie sollten App_GlobalResources und App_LocalResources vermeiden. Wie Craig erwähnt, gibt es Probleme mit App_GlobalResources/App_LocalResources, weil Sie nicht auf sie außerhalb der ASP.NET-Laufzeit zugreifen können. Ein gutes Beispiel dafür, wie dies problematisch ist, ist, wenn Sie Ihre App testen.

K. Scott Allen hat vor einiger Zeit darüber gebloggt. Er macht eine gute Arbeit, das Problem mit App_GlobalResources in ASP.NET MVC here zu erklären.

+0

Heh. Ich wollte genau das gleiche posten. Klappt wunderbar. :) –

7

Eigenschaften -> Ressourcen können außerhalb Ihrer Ansichten und starke Typen erzeugt werden, zu sehen, wenn Sie die Anwendung kompilieren.

App_ * wird von ASP.NET kompiliert, wenn Ihre Ansichten kompiliert werden. Sie sind nur in der Ansicht verfügbar. Siehe this page für global vs. lokal.

12

Wenn Sie mit der empfohlenen Lösung gehen (1) (das heißt, wie in K. Scott Alle Blog):

Für die von Ihnen versuchen explizite Lokalisierung Ausdrücke zu verwenden (auch bekannt als deklarative Ressource Bindungsausdrücke), z.B. <%$ 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); 
    } 
} 

Dann fügen Sie diese zu Ihrer web.config:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en" 
        resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" /> 
+0

Vielen Dank! Genau das, was ich brauchte. –

+0

Das ist interessant! – Michael

+0

Was ist 'Resources.ResourceInAppToGetAssembly'? Es kompiliert nicht und ich kann keinen Verweis darauf finden, aber in diesem Beispiel? Ist es ein Pseudonym für die tatsächliche Ressourcenklasse, die Sie verwenden? – ProfK