name - Localización de ASP.NET MVC 3 con DisplayAttribute y proveedor de recursos personalizado
display name c# (3)
Utilizo un proveedor de recursos personalizado para obtener cadenas de recursos de una base de datos. Esto funciona bien con ASP.NET donde puedo definir el tipo de recurso como una cadena. Los atributos de metadatos para las propiedades del modelo en MVC 3 (como [Rango], [Pantalla], [Obligatorio] requieren el tipo de un Recurso como parámetro, donde el Tipo de Recurso es el tipo de la clase de código subyacente generado de un archivo .resx .
[Display(Name = "Phone", ResourceType = typeof(MyResources))]
public string Phone { get; set; }
Como no tengo archivos .resx, dicha clase no existe. ¿Cómo puedo usar los atributos del modelo con un proveedor de recursos personalizado?
Me gustaría tener algo como esto:
[Display(Name = "Telefon", ResourceTypeName = "MyResources")]
public string Phone { get; set; }
El DisplayNameAttribute de System.ComponentModel tenía una propiedad DisplayName reemplazable para este propósito, pero la clase DisplayAttribute está sellada. Para los atributos de validación no existen clases correspondientes.
La forma más limpia que se me ocurrió es sobrescribir DataAnnotationsModelMetadataProvider
. Aquí hay un artículo muy claro sobre cómo hacer esto.
Puede extender DisplayNameAttribute y anular la propiedad de cadena DisplayName. Tengo algo como esto
public class LocalizedDisplayName : DisplayNameAttribute
{
private string DisplayNameKey { get; set; }
private string ResourceSetName { get; set; }
public LocalizedDisplayName(string displayNameKey)
: base(displayNameKey)
{
this.DisplayNameKey = displayNameKey;
}
public LocalizedDisplayName(string displayNameKey, string resourceSetName)
: base(displayNameKey)
{
this.DisplayNameKey = displayNameKey;
this.ResourceSetName = resourceSetName;
}
public override string DisplayName
{
get
{
if (string.IsNullOrEmpty(this.GlobalResourceSetName))
{
return MyHelper.GetLocalLocalizedString(this.DisplayNameKey);
}
else
{
return MyHelper.GetGlobalLocalizedString(this.DisplayNameKey, this.ResourceSetName);
}
}
}
}
}
Para MyHelper
, los métodos pueden ser algo como esto:
public string GetLocalLocalizedString(string key){
return _resourceSet.GetString(key);
}
Obviamente necesitará agregar el manejo de errores y tener el resourceReader
configurado. Más información aquí
Con esto, usted decora su modelo con el nuevo atributo, pasando la clave del recurso del que desea obtener el valor, como este
[LocalizedDisplayName("Title")]
Luego, Html.LabelFor
mostrará automáticamente el texto localizado.
Creo que tendría que anular las propiedades de DataAnnotations para localizarlas con un proveedor de recursos DB. Puede heredar de los actuales y, a continuación, especificar otras propiedades, como la cadena de conexión de DB, para usar al obtener los recursos de su proveedor personalizado.