Meilleure pratique pour ASP.NET fichiers de ressources MVC

Quelle est la meilleure utilisation des fichiers de ressources suivants.

  1. Propriétés → Ressources ( Phil utilisé cette ressource pour la localisation dans DataAnnotation)
  2. dossier App_GlobalResources
  3. App_LocalResources

je voudrais aussi savoir quelle est la différence entre (1) et (2) dans asp.net application mvc.

37
demandé sur Uwe Keim 2009-12-09 20:09:34

3 réponses

Vous devriez éviter de App_GlobalResources et App_LocalResources. Comme Craig l'a mentionné, il y a des problèmes avec App_GlobalResources/App_LocalResources parce que vous ne pouvez pas y accéder en dehors de la ASP.NET c'est parti. Un bon exemple de la façon dont cela pourrait être problématique est lorsque vous testez votre application à l'unité.

K. Scott Allen a blogué à ce sujet il y a un certain temps. Il fait un bon travail en expliquant le problème avec App_GlobalResources dans ASP.NET MVC ici.

32
répondu Ryan Rivest 2016-06-18 12:30:27

Si vous allez avec la solution recommandée (1) (c'est à dire que dans K. Scott Allen blog):

Pour ceux d'entre vous qui essayez d'utiliser des expressions de localisation (aka déclarative des ressources des expressions de liaison), par exemple:<%$ 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);
    }
}

alors, ajoutez ceci à votre site web.config:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
                   resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
12
répondu marq 2011-10-10 15:54:17

propriétés → les ressources peuvent être vues en dehors de vos vues et des types forts sont générés lorsque vous compilez votre application.

App_ * est compilé par ASP.NET, lorsque vos vues sont compilées. Ils ne sont disponibles que dans la vue. Voir cette page Pour global vs. local.

7
répondu Craig Stuntz 2018-06-21 04:48:04