Не удается заставить работать глобализацию jquery - PullRequest
17 голосов
/ 09 февраля 2012

Я пытаюсь использовать плагин jQuery Globalization, чтобы исправить проблему с запятыми с помощью jquery-проверки клиента.Однако я перепробовал много решений, и не было хорошего решения, чтобы это исправить.Я не на английском языке, и важно, чтобы мои клиенты вводили десятичное значение, например «123,66», а не «123,66».Проверка ASP.NET скажи мне, что цена должна быть числом!а?ты серьезно ?lol

Я получаю эту ошибку JavaScript, когда пытаюсь исправить.

$.global is undefined

Вот мой код.

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);
}

Я не могу понять ... это должно работать, так как я добавил ~/Scripts/globalize.js.

Любая идея?или у вас могло бы быть лучшее решение для проверки клиента и позволяющее вводить запятую как десятичные значения?

Ответы [ 3 ]

21 голосов
/ 10 февраля 2012

Я нашел способ окончательно избавиться от десятичной проблемы с разделителем запятых!

Вот картинка с результатом!Больше нет проблем с проверкой.

enter image description here

Шаги к исправлению.

1- Получите библиотеку глобализации для jQuery

Вы должны получить последний скрипт!Также я нашел некоторые ответы там, которые были устаревшими.Объект для вызова библиотеки больше не $.global или что-то в этом роде, а Globalize.

2- Включите сценарии в ваш проект.Вы должны добавить их после jquery.validation stuff.

<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 - Заменить некоторые методы валидатора.Это переопределит методы проверки 'number' и 'range', которые вызывали проблемы.

$.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 => Это фактически заменит все, что содержит ',' в '.'если вы выбрали культуру, которая требует этого.

После этого .. Вы должны добавить.Это заставит функции глобализации работать с культурой.

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

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

Полный код выглядит как ...

<!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>
2 голосов
/ 09 февраля 2012

Ну, чтобы решить ту же проблему, я сделал:

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

, а затем использовал добавленный метод как правило:

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

Я «позаимствовал» регулярное выражение валидатора у самого плагина валидации и перевернул точки . и запятые , (разделитель тысяч X десятичный разделитель).

0 голосов
/ 14 января 2016

По какой-то причине мне пришлось изменить ссылку на глобализацию с:

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

до

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

И это решило мою проблему. Сходил с ума на 30 минут, пока я не получил его на работу. Если кто-нибудь может объяснить, почему я буду оценивать.

...