2009-12-09 14 views
37

Quali sono l'utilizzo ottimale dei seguenti file di risorse.Best practice per file di risorse Asp.net MVC

  1. Proprietà -> Resources (Phil usato questa risorsa per la localizzazione in DataAnnotation) cartella
  2. App_GlobalResources cartella
  3. App_LocalResources

Mi piacerebbe anche sapere qual è la differenza tra (1) e (2) nell'applicazione asp.net mvc.

Grazie,
Soe Moe

risposta

32

È necessario evitare App_GlobalResources e App_LocalResources. Come menzionato da Craig, ci sono problemi con App_GlobalResources/App_LocalResources perché non è possibile accedervi al di fuori del runtime di ASP.NET. Un buon esempio di come sarebbe problematico è quando collaudi la tua app.

K. Scott Allen ha scritto circa un po 'di tempo fa. Fa un buon lavoro di spiegazione del problema con App_GlobalResources in ASP.NET MVC here.

+0

Eh. Volevo solo pubblicare esattamente la stessa cosa. Funziona come un fascino. :) –

7

Proprietà -> Le risorse possono essere visti al di fuori dei vostri punti di vista e dei tipi forti vengono generati quando si compila l'applicazione.

App_ * è compilato da ASP.NET, quando le tue viste sono compilate. Sono disponibili solo nella vista. Vedi this page per globale e locale.

12

Se si va con la soluzione consigliata (1) (vale a dire, come nel blog di K. Scott Allen):

Per quelli di voi cercando di usare espressioni esplicite di localizzazione (aka dichiarativi risorse espressioni vincolanti), per esempio <%$ 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); 
    } 
} 

Quindi, aggiungere questo al vostro web.config:

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

Grazie mille! Proprio quello di cui avevo bisogno. –

+0

Questo è interessante! – Michael

+0

Che cos'è 'Resources.ResourceInAppToGetAssembly'? Non si compila e non riesco a trovare alcun riferimento ad esso ma in questo esempio? È uno pseudonimo della classe di risorse effettiva che stai utilizzando? – ProfK

Problemi correlati