2009-09-26 17 views
7

tengo ValidationAttribute como:ASP.NET MVC: ValidationAttribute y localizada ErrorMessage

public class Username : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
    if (value == null) 
    return false; 

    return RegExp.Validate(RegExpLib.Username,value.ToString()); 
    } 
} 

..y usarlo como esto:

public class AccountSignIn 
{ 
    [Username(ErrorMessageResourceName ="txtUsername",ErrorMessageResourceType=typeof(SignIn))] 
    public string Username { get; set; } 

    public string Password { get; set; } 

    public bool RememberMe { get; set; } 

    public string ReturnUrl { get; set; } 
} 

SignIn es archivo de recursos en App_GlobalResources y "txtUsername" - es el nombre de la cadena en el archivo de recursos.

Problema: Los mensajes de error no se muestran.

Pregunta: Cómo configurar un mensaje de error si tengo pocos idiomas en el sitio web.

Otra información:

soy capaz de acceder SignIn.txtUsername desde puntos de vista o cualquier archivo en el proyecto. Desde el controlador

ModelState.AddModelError("Username", Resources.SignIn.txtUsername); 

funciona bien, así .. puedo asignar ErrorMessage dentro ValidationAttribute, pero ha obtenido un error de validación después de la segunda oportunidad ... si pongo comprobar como este -

if(ErrorMessage != Resources.SignIn.txtUsername) 
     ErrorMessage = Resources.SignIn.txtUsername; 

tengo error después Cambio a otro idioma: ErrorMessage se puede asignar solo una vez.

Por favor, asesórese sobre cómo puedo solucionarlo.

Gracias de antemano.

Respuesta

1

Asegúrese de que en el editor de recursos su visibilidad de recursos esté configurada como "Pública" y no como "Interna". De lo contrario, la reflexión realizada por DataAnnotations no funcionará.

+0

Cuando escribí Estoy usando recursos globales "SignIn es un archivo de recursos en App_GlobalResources" –

+0

Desafortunadamente, no puede hacer recursos en App_GlobalResources public. En su lugar, debe usar el archivo de recursos de la carpeta "Propiedades": haga clic con el botón derecho en el proyecto, seleccione las propiedades, en el menú de la izquierda, seleccione "Recursos" y haga clic en "este proyecto ...". Se creará el archivo de recursos predeterminado llamado "Resources.resx". Puede cambiarle el nombre (es decir, "ModelErrors") y usarlo en el código: [Obligatorio (ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof (Properties.ModelErrors))] – Feryt

+0

Sí, eso es cierto. Existen DataAnnotations para ser usadas fuera de ASP.NET, por lo que no saben nada sobre App_XxxResources y solo trabajan con archivos de recursos tradicionales. –

10

Tuve algunos problemas con el uso de mensajes de error localizados y DataAnnotations, prácticamente idénticos a su situación. Aunque no terminé con el espacio en blanco como mensajes de error, siempre recibí algunas excepciones. Solución para mí fue:

  1. en App_GlobalResources/Errors.resx abrir el archivo de recursos, cambie sus propiedades para ampliar la acción: Embedded recursos, herramientas personalizada: PublicResXFileCodeGenerator, Espacio de nombres de herramientas personalizada: Recursos (Visual Studio hace algo raro en autogenerating éstos, a fin de comprobar de nuevo que las cosas están bien)

  2. Cambio modificador de acceso del archivo de recursos al público

  3. comprobar desde el archivo de código generado (Errors.Designer.cs) que el espacio de nombres y modificador de acceso son correcto.

  4. Pruébalo

Mi ejemplo de la clase de modelo:

[Required(ErrorMessageResourceType = typeof(Resources.Errors), ErrorMessageResourceName="ResponseMessageRequired")] 
public string message { get; set; } 
0

Esta pregunta parece bastante viejo. Tuve un problema similar al usar resx (mi almacén de mensajes de error) como tipo de parámetro de atributo en mi proyecto MVC3.

Esto resolvió mi problema:

  • Set "Messages.resx" - fichero propiedad "Acción de generación" a "Recurso incrustado" parámetro de atributo
  • Cambio de la siguiente manera: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

Espero que esto ayude.