mvc3 jquery ненавязчивая проверка локаль десятичное поле - PullRequest
6 голосов
/ 22 мая 2011

Я работаю над локализованным веб-приложением mvc3, используя ненавязчивую проверку.В web.config у меня есть:

<globalization culture="pl-PL" uiCulture="pl" />

Используется Jquery 1.4.4 и jquery validation 1.6.

Проблема с разделителем десятичных чисел.

Я вижу, что проверка JQuery игнорирует культуру и ожидает, что точечный символ всегда будет десятичным разделителем.Мне нужно использовать запятую вместо.Например, в немецком языке то же самое.

Я создал свой собственный файл method_pl.js:

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

Выше приведено решение основной проблемы, когда десятичное число вообще не распознается.

Но когда я пытаюсь использовать RangeAttribute в своей модели, свойство Decimal Price все равно не работает.Как это решить?

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Если вы установите

key="UnobtrusiveJavaScriptEnabled" value="false"

, то DecimalModelBinder, опубликованный в предыдущем ответе, будет работать, но вы отключаете проверки на стороне клиента.

Для решения вашей проблемы вам необходимоВключите правильный языковой стандарт JQuery.Посмотрите этот пост от Скотта Хансельмана или этот пост они должны оказать вам некоторую помощь в его реализации.

Вы должны добавить форму плагина Jquery.globalize NuGet, затем вВаша функция DOMready добавляет что-то подобное для правильной проверки номера (по крайней мере, это работает для меня)

 $.validator.methods.number = function (value, element) {
        if (Globalize.parseFloat(value)) 
            return true;
        return false;
    }
 Globalize.culture('fr-FR');

, затем добавьте соответствующие скрипты на своей странице

<script src="@Url.Content("~/Scripts/jquery-1.7.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>
<script src="@Url.Content("~/Scripts/jquery.globalize/globalize.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.fr-FR.js")" type="text/javascript"></script>
1 голос
/ 26 мая 2011

Фил Хаак опубликовал некоторую информацию об этой проблеме.

См. Здесь.

В посте он описывает следующее:

using System;
using System.Globalization;
using System.Web.Mvc;

public class DecimalModelBinder : IModelBinder {
    public object BindModel(ControllerContext controllerContext, 
    ModelBindingContext bindingContext) {
    ValueProviderResult valueResult = bindingContext.ValueProvider
        .GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    try {
        actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
            CultureInfo.CurrentCulture);
    }
    catch (FormatException e) {
        modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
    }
}

а затем в Global.asax

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

Я не уверен, решит ли это проблему и на клиенте (Фил, кажется, указывает, что это будет работать), но это должно решить проблему на сервересторона как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...