asp.net-mvc - route - select asp-for asp-items
Práctica recomendada para archivos de recursos ASP.NET MVC (3)
¿Cuál es el mejor uso de los siguientes archivos de recursos?
- Propiedades → Recursos ( Phil usó este recurso para la localización en DataAnnotation)
- Carpeta App_GlobalResources
- Carpeta App_LocalResources
También me gustaría saber cuál es la diferencia entre (1) y (2) en la aplicación asp.net mvc.
Propiedades → Los recursos se pueden ver fuera de sus vistas y se generan tipos fuertes cuando compila su aplicación.
App_ * es compilado por ASP.NET, cuando tus vistas son compiladas. Solo están disponibles en la vista. Vea esta página para global vs. local.
Si elige la solución recomendada (1) (es decir, como en el blog de K. Scott Allen):
Para aquellos de ustedes que intentan usar expresiones de localización explícitas (también conocidas como expresiones declarativas de enlace de recursos), 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);
}
}
Luego, agregue esto a su web.config:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Debería evitar App_GlobalResources
y App_LocalResources
. Como mencionó Craig, hay problemas con App_GlobalResources
/ App_LocalResources
porque no puede acceder a ellos fuera del tiempo de ejecución de ASP.NET. Un buen ejemplo de cómo esto sería problemático es cuando estás probando tu aplicación de manera unitaria.
K. Scott Allen blogueó sobre esto hace un tiempo. Él hace un buen trabajo al explicar el problema con App_GlobalResources
en ASP.NET MVC here .