Проблема с глобализацией MVC5 и jQuery при проверке Double (nl-BE)

#javascript #jquery #validation #asp.net-mvc-5 #jquery-globalize

#javascript #jquery #проверка #asp.net-mvc-5 #jquery-глобализация

Вопрос:

У меня очень простой сценарий:

В моей модели:

 public Double MyNumber { get; set; }
  

(пока нет аннотаций)

На мой взгляд:

 <input type="hidden" id="locale" value="@System.Threading.Thread.CurrentThread.CurrentUICulture"/>

@Html.LabelFor(model => model.MyNumber)
@Html.EditorFor(model => model.MyNumber)
@Html.ValidationMessageFor(model => model.MyNumber)
  

В моем коде javascript на той же странице:

 <script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/cldr.js"></script>
<script src="/Scripts/cldr/event.js"></script>
<script src="/Scripts/cldr/supplemental.js"></script>
<script src="/Scripts/globalize.js"></script>
<script src="/Scripts/globalize/number.js"></script>
<script src="/Scripts/globalize/date.js"></script>
<script src="/Scripts/jquery.validate.globalize.js"></script>

<script>
    $.when(
        $.getJSON("/Scripts/cldr/supplemental/likelySubtags.json"),
        $.getJSON("/Scripts/cldr/main/"   $("#locale").val()   "/numbers.json"),
        $.getJSON("/Scripts/cldr/supplemental/numberingSystems.json"),
        $.getJSON("/Scripts/cldr/main/"   $("#locale").val()   "/ca-gregorian.json"),
        $.getJSON("/Scripts/cldr/main/"   $("#locale").val()   "/timeZoneNames.json"),
        $.getJSON("/Scripts/cldr/supplemental/timeData.json"),
        $.getJSON("/Scripts/cldr/supplemental/weekData.json")
        ).then(function () {
            return [].slice.apply(arguments, [0]).map(function (result) {
                return result[0];
            });
        }).then(Globalize.load).then(function () {
            Globalize.locale($("#locale").val());
        }).then(console.log("LOADED EVERYTHING"));
</script>
  

Я не получаю ошибок при загрузке страницы, поэтому я предполагаю, что инициализация глобализации прошла успешно

Теперь проблема (при использовании культуры nl-BE):

  • Оба 1.23 и 1,23 принимаются при проверке на стороне клиента.
  • В соответствии с культурой nl-BE следует принимать только 1,23.
  • Проверка на стороне сервера (.NET) работает должным образом и отклоняет 1.23.

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

Я делаю что-то не так с JQuery.Globalize проверкой? (Я должен сказать, что версия 0.x была намного более простой в использовании. Эта версия 1.x с данными CLDR настолько сложна, когда вы не хотите использовать npm или bower, а только nuget)

Для ясности, это мои ожидания, но, возможно, я ожидаю слишком многого

  • Пользователь может переключаться между разными культурами. Некоторые из этих культур ожидают 3,14 для PI, некоторые ожидают 3,14 для PI
  • В культуре, где «.» является десятичным разделителем, я хочу, чтобы проверка на стороне клиента принимала только «3,14» и показывала ошибку при вводе «3,14».
  • В культуре, где «,» является десятичным разделителем, я хочу, чтобы проверка на стороне клиента принимала только «3,14» и показывала ошибку при вводе «3,14».
  • Таким образом, проверка на стороне клиента и сервера синхронизируется.
  • Так или иначе, я ожидал jQuery.Глобализируйте, чтобы сделать это за меня.
  • На данный момент проверка на стороне клиента принимает оба варианта, но проверка на стороне сервера принимает только правильный.

Как я могу это решить?

Комментарии:

1. Проблема здесь в том, что JavaScript не заботится о . или , обозначении, если вы parseInt() задаете значение. Это работает. Возможно, вы захотите сделать string.replace() там.

2. Я не использую parseInt или любой другой явный код JavaScript для полей. Я ожидаю, что jQuery Globalize проверит поле «ненавязчивым» способом.

3. Вы его не используете, но я имел в виду, что JavaScript на самом деле не заботится о , or . , он работает одинаково для интерпретатора.