2012-02-09 14 views
16

Intento utilizar el complemento jQuery Globalization para solucionar el problema de coma con la validación de cliente no obstructiva de jquery. Sin embargo, probé muchas soluciones y no hay una buena solución para arreglar esto. Estoy en una computadora de localización no inglesa y esto es importante para que mis clientes ingresen un valor decimal como "123,66" y no "123,66". Validación de ASP.NET dime que el precio debe ser un número! ¿Meh? En serio ? lolNo se puede obtener la globalización de jquery para que funcione

Recibo este error de javascript cuando intento solucionarlo.

$.global is undefined 

Aquí mi código.

Layout.cshtml

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 

    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script> 

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

    <script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/jquery.form.js")"type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/glob.fix.js")" type="text/javascript"></script> 
</head> 

<body> 
    @RenderBody() 
</body> 
</html> 

glob.fix.js

$.validator.methods.range = function (value, element, param) { 
    var globalizedValue = value.replace(",", "."); 
    return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]); 
} 

$.validator.methods.number = function (value, element) { 
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value); 
} 

No puedo entender .. que debería funcionar desde añadí ~/Scripts/globalize.js.

¿Alguna idea? ¿o podría tener una mejor solución para que la validación del cliente funcione y me permite ingresar una coma como valores decimales?

+0

¡Gracias por el código del validador de rango! –

Respuesta

21

¡Encontré la manera de finalmente deshacerme del problema decimal con el separador de coma!

¡Aquí una imagen del resultado! No más problemas de validación

enter image description here

Los pasos para la corrección.

1- Obtener el Globalization library for jQuery

Debe obtener la última guión! También encontré algunas respuestas que estaban desactualizadas.
El objeto para llamar a la biblioteca no es más $.global ni nada de eso, pero Globalize.

2- Incluya los scripts en su proyecto. Debe agregarlos después de jquery.validation cosas.

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 

3- Reemplazar algunos métodos del validador. Esto anulará los métodos de validación de 'número' y 'rango' que causaban problemas.

$.validator.methods.number = function (value, element) { 
    return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
} 

$.validator.methods.range = function (value, element, param) { 
    return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
} 

Globalize.parseFloat => En realidad, esto reemplazará cualquier cosa que contenga '' a '' si seleccionó una cultura que lo requiera.

Después de esto .. Debe agregar. Esto hará que las funciones de globalización funcionen con la cultura.

$(document).ready(function() { 
     Globalize.culture('fr-CA'); 

     // Only there to show which culture are being used. 
     console.log(Globalize.culture().name); 
}); 

El look completo código como ...

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 

    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> </script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.form.js")"type="text/javascript"></script> 


<script type="text/javascript"> 

    $.validator.methods.number = function (value, element) { 
     return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
    } 
    $.validator.methods.range = function (value, element, param) { 
     return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
    } 

    $(document).ready(function() { 
     Globalize.culture('fr-CA'); 

     // Only there to show which culture are being used. 
     console.log(Globalize.culture().name); 
    }); 
</script> 

</head> 

<body> 
    @RenderBody() 
</body> 
</html> 
+0

Puede marcar nuestra propia respuesta como aceptada. Merci :-) – Ubikuity

+0

Gracias. ¡Yo si! :) – Rushino

+0

¿Dónde se encuentra el archivo Globalize.js en la url github? – Levimatt

2

Bueno, para resolver el mismo problema, lo hice:

$.validator.addMethod("price",function(value){ 
    return /^(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); 
}); 

y luego se usa el método agregado como regla:

$("#form").validate({ 
    rules: { 
     price: "price" 
    } 
}); 

I "prestada" la expresión regular validador del propio plugin de validación e invirtió los puntos . y las comas , (separador de decimales X separador decimal).

+0

¿Dónde pusiste eso validar (...)? – Rushino

+0

http://docs.jquery.com/Plugins/Validation/ - mira "Ver código fuente" del primer Ejemplo/Demostración –

+0

Estoy empezando a pensar que no debo usar la validación no obstructiva de asp.net mvc, pero uso solo el complemento en su lugar. (Sé que asp.net mvc usa ese complemento, pero parece que no tengo control sobre algo que me causa muchos problemas) – Rushino

0

Por alguna razón que tenía que cambiar mi referencia globalizado de:

<script src="@Url.Content("~/Scripts/globalize/globalize.js")" type="text/javascript"</script> 

a

<script type="text/javascript" src="~/Scripts/globalize/globalize.js"</script> 

Y eso resolvió mi problema Me volví loco por 30 minutos hasta que lo hice funcionar. Si alguien puede explicar por qué voy a appreaciate.

Cuestiones relacionadas