c# - validator - mvc required field validation




La anotación de datos requerida no se está traduciendo (2)

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

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.


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