37 votes

Méthode recommandée pour les fichiers de ressources Asp.net MVC

Quelles sont les meilleures utilisations des fichiers de ressources suivants?

  1. Propriétés -> Ressources ( Phil a utilisé cette ressource pour la localisation dans DataAnnotation)
  2. Dossier App_GlobalResources
  3. Dossier App_LocalResources

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

Merci,
Soe Moe

32voto

Ryan Rivest Points 797

Vous devriez éviter de App_GlobalResources et App_LocalResources. Comme Craig 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 runtime.. Un bon exemple de comment cela serait problématique, c'est lorsque vous êtes à l'unité de test de votre application.

K. Scott Allen blogué sur ce il ya un moment. Il fait un bon travail en expliquant le problème avec App_GlobalResources dans ASP.NET MVC.

http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx

12voto

marq Points 328

Si vous choisissez la solution recommandée (1) (comme dans le blog de K. Scott Allen):

Pour ceux qui essaient d'utiliser des expressions de localisation explicites (expressions de liaison de ressources déclaratives), 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);
    }
}
 

Ajoutez ensuite ceci à votre web.config:

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

7voto

Craig Stuntz Points 95965

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X