Pregunta

¿Cuáles son el mejor uso de los archivos de recursos siguientes.

  1. Propiedades → Recursos ( Phil utilizó este de recursos para localización en DataAnnotation)
  2. carpeta
  3. App_GlobalResources
  4. carpeta
  5. App_LocalResources

También me gustaría saber cuál es la diferencia entre (1) y (2) en la aplicación asp.net mvc.

¿Fue útil?

Solución

Debe evitar App_GlobalResources y App_LocalResources. Al igual que Craig se ha mencionado, hay problemas con App_GlobalResources / App_LocalResources porque no se puede acceder a ellos fuera del tiempo de ejecución de ASP.NET. Un buen ejemplo de cómo esto podría ser problemático es cuando estás unidad de pruebas de su aplicación.

K. Scott Allen escribió en su blog sobre esto hace un tiempo. Él hace un buen trabajo de explicar el problema con App_GlobalResources en ASP.NET MVC aquí .

Otros consejos

Si vas con la solución recomendada (1) (es decir, como en el blog de de K. Scott Allen):

Para aquellos de ustedes tratando de utilizar expresiones de localización explícitas (expresiones de enlace de recursos de alias declarativa), por ejemplo, <%$ 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);
    }
}

A continuación, añadir esto a su web.config:

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

Propiedades → Los recursos pueden ser vistos fuera de sus puntos de vista y tipos fuertes son generados al compilar su aplicación.

* app_ está compilado por ASP.NET, cuando se compilan sus puntos de vista. Sólo están disponibles en la vista. Ver esta página para del planeta contra el local.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top