2012-05-22 18 views
10

Tengo un sitio web totalmente localizado, que está en su mayoría en francés/inglés/alemán.Asp.Net MVC: ¿Algún mensaje de error predeterminado no localizado?

Por ahora, todo iba bien, pero sí noté un problema con algún mensaje de error de asp.net MVC.

tengo una propiedad en mi modelo:

[Required] 
[LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] 
public DateTime PublicationDate { get; set; } 

LocalizedDisplayname es una extensión de la DisplayNameAttribute, que va en el archivo Resx para obtener la traducción correcta

El CurrentCulture hilo y los CurrentCultureUI son en fr-FR, por lo que el mensaje debe mostrarse en francés (como hace con mi [Required] Atributo, mostrar automáticamente "Le champ Publication est requis".

Pero en el caso de un DateTime, si Entro en algo que no es una fecha, el validador sólo me devuelve una "The value 'asdfasdf' is not valid for Publication." Así:

  • Por qué MVC me vuelve a veces mensaje de error en francés, y algunas veces en Inglés, en la misma forma (y yo precisa, es el mensaje de error por defecto)
  • Cómo reemplazar este mensaje genericly, mediante la indicación de un texto como "la valeur {0} n'est pas une fecha valide pour le champ {1}"

Gracias usted mucho

Respuesta

6

Creo que estos responden a sus dos preguntas:

  • Por qué MVC me vuelve a veces mensaje de error en francés, y algunas veces en Inglés, en la misma forma (y precisa, es el mensaje de error por defecto)

Una diferencia notable es que el 012 El atributorealiza una validación explícita del lado del cliente, mientras que cuando su campo no contiene un DateTime válido, obtiene una validación del lado del servidor a través de una falla del enlazador de modelo predeterminado para crear un objeto DateTime a partir de los datos del formulario publicado. Es un mecanismo bastante diferente, que supongo explica el resultado diferente. Hubiera sido bueno si el resultado hubiera sido constante, por supuesto.

  • Como reemplazar este mensaje genericly, mediante la indicación de un texto como "La valeur {0} n'est pas une fecha valide pour le champ {1}"

Hay De dos maneras:

  1. Indique al archivador de modelos predeterminado qué cadena de recursos usar para el mensaje de error usando la propiedad DefaultModelBinder.ResourceClassKey. Consulte la respuesta al this related question para obtener una descripción de cómo lograr esto (para MVC 2 pero no ha cambiado en MVC 3)
  2. Un método más agradable (creo) es realizar una validación del lado del cliente. Esto le permite proporcionar la cadena del mensaje de error que desea de sus recursos localizados. Hágalo agregando un atributo DataType como se muestra a continuación, asumiendo que creó una clase de recurso llamada MyLocalizedResources con una cadena que tiene la clave DateTimeFormatValidationMessage traducida al francés como "La valeur {0} n'est pas une date valide pour le champ {1}":

    [Required] 
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")] 
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] 
    public DateTime PublicationDate { get; set; } 
    
+0

Gracias. Como toda mi cadena localizable está en una DLL diferente, no puedo usar el '1.'. Entonces usaré el segundo. ¡Muchas gracias por la respuesta! – J4N

+0

Quizás haya aceptado la respuesta demasiado pronto, puse el atributo Tipo de datos, exactamente como lo indicó, pero todavía tengo el mensaje anterior cuando mi tipo no es una fecha – J4N

+1

Existen otros atributos para otros tipos de datos. Por ejemplo, tengo esto para mostrar mensajes de error localizados para un campo de texto de correo electrónico requerido: [Obligatorio (ErrorMessageResourceType = typeof (Shared), ErrorMessageResourceName = "RequiredFieldValidationMessage", ErrorMessage = null)] [EmailAddress (ErrorMessageResourceType = typeof (Shared), ErrorMessageResourceName = "EmailFormatValidationMessage", ErrorMessage = null)] cadena pública Correo electrónico {get; conjunto; } – Clafou

1

ASP.N El marco de ET MVC hace un par de validaciones implícitas: una es una validación requerida y la otra es si el valor es válido para la propiedad o no tipo de validación y esto sucede aunque no decoramos las propiedades con anotaciones de datos.

Tienes que crear claves para PropertyValueInvalid y PropertyValueRequired en tu clase de recurso global.

Este hilo le ayudará a Globally localize validation

0

Usted puede localizar sus atributos de validación personalizada. También localizas atributos incorporados de ASP.NET MVC.

Como el atributo [Requerido].

Un ejemplo:

[LocalizedRequired(ErrorMessage = "You must specify an email address")] 
string SomeProperty { get; set; } 

Y sólo puede anular la propiedad Requerido:

public class LocalizedRequiredAttribute: RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return LocalizedString(ErrorMessage, name); 
    } 
} 

El reasone que se muestra en las lenguas diferen es: Creo código de la cultura get mvc del usuario actual en el cliente lado.

+0

No, en absoluto ... como ya he dicho, la configuración regional de Thread es fr-FR. Y otro mensaje estaba en el lenguaje correcto. Incluso los textos del lado del cliente se generan del lado del servidor con la configuración regional del servidor. (y de forma predeterminada, configuré la cultura del hilo en la cultura del navegador) – J4N

0

Tuve el mismo problema, la misma estructura de proyecto. Finalmente utilicé las convenciones de MVC, inténtalo de esta manera.

I sustituye todos [requerido] anotaciones de datos con

[Obligatorio (ErrorMessageResourceName = "Common_Mandatory_Field", ErrorMessageResourceType = typeof (MyExternalDllResources.Language))]

En cadena de recursos "Common_Mandatory_Field" se define en este manera, ejemplos: archivo de recursos italiano :: Il campo {0} è obbligatorio.

Archivo de recursos en inglés :: El campo {0} es obligatorio.

archivo de recursos de Japón :: {0} フ ィ ー ル ド が 必要 で す.

MVC reemplazará {0} con el nombre de [Pantalla] valor de anotación de datos del control asociado, traducido si acaso. Si no proporciona una anotación de datos [Visualizar], se usará la definición de propiedad.

Cuestiones relacionadas