validator side net mvc for data custom asp annotation c# asp.net asp.net-mvc validation data-annotations

c# - side - La anotación de datos requerida no se está traduciendo



model validation c# (3)

Estamos frente a un error extraño con la localización del atributo Requerido.

Tenemos el siguiente código:

public class AnswersGroupViewModel { public int IDAnswerGroup { get; set; } public int IDEvaluator { get; set; } public List<AnswersViewModel> Answers { get; set; } } public class AnswersViewModel { public string Text{ get; set; } [Required(ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof(Resources.Language))] public int IDAnswer{ get; set; } }

El problema es que la traducción correcta de "RequiredMessage" no se está recogiendo del archivo de recursos, aunque está presente (tenemos RequiredMessage en archivos de recursos tanto españoles como rusos).

Los atributos como Mostrar están funcionando y se están traduciendo, pero parece ser un problema con el atributo Requerido.

Aquí hay una imagen de ejemplo:

El error se muestra con un @ Html.ValidationMessage

Gracias de antemano por tu ayuda.


Asegúrese de que el contexto de su subproceso actual se haya actualizado para utilizar la información de cultura correcta basada en los encabezados de solicitud del cliente web. Esto debería ser automático si tiene definida la etiqueta <globalization ..> . De lo contrario, agregue un filtro para interceptar la solicitud y realizar la actualización.

var cultureName = "de-DE"; // get this from request headers var ci = new CultureInfo(cultureName); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci;

Vea también De donde CultureInfo.CurrentCulture lee la cultura


Comenzaría por configurar el elemento de globalización en web.config

<system.web> <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>

A continuación, verifico la cultura que está obteniendo en un controlador (inicie sesión en DB o pase a una vista con @ViewBag

culture = CultureInfo.InstalledUICulture.IetfLanguageTag; if (HttpContext.Current != null && HttpContext.Current.Request.UserLanguages != null) { culture = Request.UserLanguages[0]; }

Confirme que los valores que utiliza para identificar la cultura son los valores utilizados por los encabezados

Seguir

Está utilizando encabezados de globalización para verificar el idioma del usuario, pero está configurando el idioma del usuario manualmente en el navegador.

2 enfoques para probar:

1) configurar el idioma del usuario en el navegador usando Javascript:

<script type="text/javascript"> Globalize.culture("@ViewBag.Culture"); </script>

O si la cultura se establece en Javascript (vs C #)

<script type="text/javascript"> Globalize.culture(culturevariable); </script>

2) ParameterisedRequiredAttribute

public class ParameterisedRequiredAttribute : RequiredAttribute { private string[] _replacements { get; set; } public ParameterisedRequiredAttribute(params string[] replacements) { _replacements = replacements; ErrorMessageResourceName = ErrorMessagesErrors.SpecificFieldRequired; ErrorMessageResourceType = typeof(ErrorMessages); } public override string FormatErrorMessage(string name) { return string.Format(ErrorMessageString, (object[])_replacements); } }

El primer enfoque parece ser una mejor solución si está configurando manualmente el idioma. En pocas palabras, la anotación tendría que volver a establecerse cada vez que el usuario cambia los modos de idioma.

Otra cosa a considerar es que la forma en que actualmente configura el idioma (a través de los encabezados) es probablemente su mejor solución. Si bien esto es más difícil de probar porque necesita un cliente con un lenguaje dedicado, esta es la forma en que sus usuarios se distinguen mejor (por encabezados).


He creado una aplicación de muestra para reproducir su problema. Funciona para mí, así que te daré mi configuración actual.

Tengo un proyecto de aplicación web que hace referencia a un conjunto de recursos de biblioteca.

Tengo 2 archivos resx en el proyecto de recursos (language.resx y language.fr.resx). Ambos archivos tienen las mismas propiedades:

  • Acción de construcción: Recurso incrustado,
  • Herramienta personalizada: PublicResXFileCodeGenerator,
  • Espacio de nombres de herramientas personalizadas: MyResources

ViewModel AnswersViewModel tiene un atributo IDAnswer con el siguiente atributo:

[Required(ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof(MyResources.Language))]

He agregado el espacio de nombres MyResource al archivo web.config en la carpeta Ver y he actualizado la sección system.web del principal web.config agregando

<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>

Espero que te ayude.