Domanda

Quali sono i migliori utilizzo dei seguenti file di risorse.

  1. Proprietà → Risorse ( Phil usato questo risorse per la localizzazione in DataAnnotation)
  2. cartella
  3. App_GlobalResources
  4. cartella
  5. App_LocalResources

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

È stato utile?

Soluzione

Si dovrebbe evitare App_GlobalResources e App_LocalResources. Come Craig accennato, ci sono problemi con App_GlobalResources / App_LocalResources perché non è possibile accedere al di fuori del runtime ASP.NET. Un buon esempio di come questo sarebbe problematico è quando sei unità di testare la vostra applicazione.

K. Scott Allen bloggato su questo qualche tempo fa. Egli fa un buon lavoro di spiegare il problema con App_GlobalResources in ASP.NET MVC qui .

Altri suggerimenti

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 le espressioni di localizzazione espliciti (aka risorse dichiarativa 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 tuo web.config:

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

Proprietà → Le risorse possono essere viste al di fuori dei vostri punti di vista e dei tipi forti vengono generate quando si compila l'applicazione.

* app_ è compilato da ASP.NET, quando le vostre opinioni sono compilati. Sono disponibili solo nella vista. Vedere questa pagina for global vs. locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top