2010-12-17 16 views
11

Mi objetivo es validar una entrada del usuario en el lado del cliente, dependiendo de la cultura de los usuarios.ASP.NET MVC 3 RC 2 validación del lado del cliente con globalización

que tienen un modelo de datos primitiva con la siguiente estructura:

public class User 
{ 
public int UserId { get; set; } 

[Required] 
[StringLength(20,MinimumLength=3)] 
public string Name { get; set; } 

[Required] 
public double Height { get; set; } 
} 

Por otra parte, quiero tener habilitada la validación del lado del cliente, comprobar si es un número válido. Por lo tanto, he agregado las siguientes líneas en la sección <head> de mi _Layout.cshtml.

<script src="@Url.Content("~/Scripts/jQuery-1.4.2.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

Desde que quieren tener la capacidad de validar la entrada en otros formatos de lenguaje (en este contexto particular, que es alemán con el formato de número decimal de 0,75 mientras que en los EE.UU. sería 0.75), he añadido las siguientes líneas (jQuery Globalization PlugIn) DESPUÉS de los jquery.validate.min.js y jquery.validate.unobtrusive.min.js anteriormente mencionados.

<script src="@Url.Content("~/Scripts/jquery.glob.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globinfo/jquery.glob.de-de.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $.culture = jQuery.cultures['de-DE']; 
    $.preferCulture($.culture.name); 
}); 
</script> 

Además, he añadido la siguiente línea a la web.config en la sección system.web sólo para asegurarse de que la cultura alemana se selecciona siempre:

<globalization culture="de-DE" uiCulture="de-DE" /> 

Ahora estoy experimentando el siguiente comportamiento :

  • Si escribo en 0,1 (nótese la 'ortografía' alemán) en el cuadro de texto para el valor de "Altura", el mensaje de error de validación 012 Aparecey no puedo enviar el formulario.
  • Si escribo en 0.1 (Inglés 'ortografía'), puedo enviar el formulario, pero la validación en el servidor devuelve el siguiente mensaje de error de validación The value '0.1' is not valid for Height.

Así que ahora estoy en una especie de bloqueo de la muerte, donde No puedo salir.

Una vez más, mi objetivo es validar la entrada del número decimal en el lado del cliente Y del servidor, en función de la cultura de los usuarios (en este caso, está forzado a ser alemán). ¿Qué estoy haciendo mal?

¡Cualquier ayuda es muy apreciada! ¡Gracias de antemano!

Respuesta

8

Desafortunadamente hay un conflicto de nombres entre las funciones jQuery.validate.format y jQuery.Globalization.format. Por lo tanto, tendrá que cambiar su código para usar el complemento de Globalización no-jquery.

Acabo de escribir una entrada en el blog al respecto here.

Para usted que debería tener este aspecto:

<script src="@Url.Content("~/Scripts/globalization.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globinfo/Globalization.de-DE.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
$.validator.methods.number = function (value, element) { 
    if (!isNaN(Globalization.parseFloat(value))) { 
     return true; 
    } 
    return false; 
} 
$(document).ready(function() { 
    $.culture = jQuery.cultures['de-DE']; 
    $.preferCulture($.culture.name); 
    Globalization.preferCulture($.culture.name); 
}); 
</script> 

Eso debería ser suficiente.

+0

Su 'if' identifica incorrectamente' 0' como un valor no válido; use 'return! isNaN (Globalization.parseFloat (value));' como el cuerpo de la función. –

+0

¿Informó a los creadores de plugins? Por favor, hazlo si aún no lo has hecho. Estoy teniendo el mismo problema que sde, pero no quiero "hackear" con los métodos no oficiales o de sobreescritura. – toebens

+0

Bueno, acabo de ahorrarme una tonelada de excavación de código: eres una estrella, ¡muchas gracias por la publicación del blog y compartir esto en SO! – Dav

1

Tuve que deshabilitar el UnobtrusiveJavaScript. La página ya no reacciona al instante, pero al menos funciona.

Puede deshabilitarlo de manera predeterminada en Web.Config.

<appSettings> 
    <add key="enableSimpleMembership" value="false"/> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="false"/> 
</appSettings> 

y yo uso los guiones para la validación de Microsoft:

MicrosoftAjax.js 
MicrosoftMvcAjax.js 
MicrosoftMvcValidation.js 

Y también el jquery-1.4.4.min.js & cosa jquery.glob, pero creo que las uso interno. La validación está siendo realizada por los scripts de MS.

Cuestiones relacionadas