14

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 .Localización de ASP.NET MVC 3 con DisplayAttribute y proveedor de recursos personalizado

[Display(Name = "Phone", ResourceType = typeof(MyResources))] 
    public string Phone { get; set; } 

Porque no tengo archivos .resx, no existe tal clase. ¿Cómo puedo usar el modelo de atributos con un proveedor de recursos personalizada?

me gustaría tener algo como esto :

[Display(Name = "Telefon", ResourceTypeName = "MyResources")] 
    public string Phone { get; set; } 

The 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.

Respuesta

4

se puede ampliar el 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); 
} 

Es obvio que tendrá que añadir el control de errores y tener la resourceReader levantado. Más información here

Con esto, luego decorar su modelo con el nuevo atributo, pasando la clave del recurso que desea obtener el valor de, como este

[LocalizedDisplayName("Title")] 

Entonces el Html.LabelFor mostrará el localizados texto de forma automática

+1

i Creo que olvidó poner el código de "MyHelper.GetLocalLocalizedString" –

+0

Sé que esto va a ser zombie, pero usted se merece más internets para esto. – Machinarius

+1

¿Y cuál es el código en "MyHelper.GetLocalLocalizedString" ??? – Bellash

2

Creo que tendría que anular las propiedades de DataAnnotaciones 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.

+0

Desafortunadamente, esto no funciona, ya que DisplayAttribute es una clase sellada. Incluso si hago mi propia implementación para el atributo, también tendría que sobrescribir los métodos de Extensión Html (por ejemplo, Html.LabelFor). – slfan

+0

Realicé más investigaciones: podría derivar de DisplayNameAttribute que tiene una propiedad overrideble DisplayName. Al final utilicé una plantilla T4 para generar la clase Resources porque no tengo que implementar todos los atributos de anotación de datos. – slfan

7

La manera más limpia que se me ocurrió es anular DataAnnotationsModelMetadataProvider. Aquí hay un artículo muy claro sobre cómo hacer esto.

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

+0

nos mostrarías cómo lograste escribir eso. El artículo muestra cómo agregar una nueva notación de datos, pero no muestra nada sobre la localización –

+0

Ver http://www.codeproject.com/Tips/514321/A-Simple-and-Effective-Way-to-L –

Cuestiones relacionadas