2010-10-19 12 views
7

Soy bastante nuevo en asp.net mvc, y estoy seguro de que estoy tratando de averiguar una buena práctica para hacer la validación de entrada.asp.net entrada de mvc/validación de modelo multi idioma

En el proyecto que vamos a utilizar marco de la entidad, donde se puede añadir anotaciones de datos a las propiedades de la siguiente manera:

[Required(ErrorMessage = "Please enter a product name")] 
[Column] 
public string Name { get; set; } 

Esto es bastante agradable, sin embargo tenemos un sitio web en varios idiomas (como la mayoría de los sitios web), , por lo que no solo podemos mostrar los mensajes de error en inglés. ¿Cuál puede ser una forma de resolver esto? ¿Puedo cambiar este mensaje de error @runtime, dependiendo del idioma del usuario? ¿Debo usar la validación del lado del cliente de Jquery?

Gracias por la entrada.

Actualización He intentado con el código en el sitio web de Phil Haack Esto hará el truco con los recursos estáticos, sin embargo, utilizamos recursos que provienen de una base de datos no estática.

Si lleno en el siguiente para los DataAnnotations:

[MetadataType(typeof(IncidentsMetaData))] 
public partial class INCIDENTS 
{ 
    private class IncidentsMetaData 
    { 
     [Required(ErrorMessageResourceType = typeof(CustomResourceProviders.DBResourceProviderFactory), 
      ErrorMessageResourceName="1277")] 
     public string SUBJECT { get; set; } 
    } 
} 

Entonces me sale el siguiente error: El tipo de recurso 'CustomResourceProviders.DBResourceProviderFactory' no tiene una propiedad estática accesible llamado '1277'.

Por supuesto, no hay tal propiedad, se debe acceder mediante una función. ¿Alguna idea de lo que podría hacer al respecto? tnx

Respuesta

2

Phil Haack ha escrito good blog post que explica cómo hacerlo. Básicamente, es casi lo mismo, excepto que utiliza archivos de recursos para proporcionar los mensajes.

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Required")] 
public string MyProperty{ get; set; } 
+0

Gracias por la respuesta. – denappel

+0

He editado la pregunta, porque aunque la respuesta es útil, no resuelve mi problema por completo – denappel

+0

¿Encontró la solución, me encontré con el mismo problema que usted –

8

Puede heredar atributo personalizado de RequiredAttribute y establecer su propio mensaje localizado por la propiedad ErrorMessage. Se puede se parece a esto:

public class LocalizedRequiredAttribute : RequiredAttribute 
{ 
    public LocalizedRequiredAttribute() 
     : base() 
    { 
     // prefix for the selection of localized messages from datebase 
     // e.x. for "Required" string, localized messages will be: "RuRequired", "EnRequired" 
     var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; 

     // logic to get value from datebase 
     // e.x. using Linq2Sql 
     using (var context = new dateBaseContext()) 
     { 
      var query = (from x in context.LocalizedStrings 
         where x.NameKey == currentCulture + "Required" 
         select x.NameValue).SingleOrDefault(); 

      if (query != null) 
      { 
       base.ErrorMessage = query; 
      } 
      else 
      { 
       base.ErrorMessage = "UndefinedName"; 
      } 
     }    

    } 
} 

también y le heredar de DisplayNameAttribute y anular DisplayName propiedad:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute 
{ 
    public LocalizedDisplayNameAttribute(string displayNameKey) 
     : base(displayNameKey) 
    { 
    } 

    public override string DisplayName 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(base.DisplayName)) 
      { 
       // prefix for the selection of localized messages from datebase 
       // e.x. if DisplayName is "Country", localized messages will be: "RuCountry", "EnCountry" 
       var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; 

       // logic to get value from datebase 
       // e.x. using Linq2Sql 
       using (var context = new dateBaseContext()) 
       { 
        var query = (from x in context.DisplayNames 
           where x.DisplayNameKey == currentCulture + base.DisplayName 
           select x.DisplayNameValue).SingleOrDefault(); 

        if (query != null) 
        { 
         return query; 
        } 

        return base.DisplayName; 
       } 
      } 

      return "UndefinedName"; 
     } 
    } 
} 

también puede crear sus atributos de validación personalizada que hereda de la clase ValidationAttribute.

+0

A partir de este momento, parece que esto es todavía el único método que permite el uso de cadenas multilenguaje desde una base de datos. Además, también se puede usar un mecanismo de caché para evitar consultar la base de datos para cada validación. (Quería agregar este comentario en caso de que alguien se queje sobre el rendimiento). – beawolf

Cuestiones relacionadas