Проверка MVC/JQuery не принимает запятую в качестве десятичного разделителя

07.01.2018 обновление

хотя было предложено, что это скорее проблема jQuery, чем проблема MVC, я думаю, что это проблема MVC. Я создал все приложение в asp.net core 2.0 MVC и ошибка сохраняются. Что связывает его с MVC для меня, это тот факт, что я могу решить проблему проверки даты, добавив строку [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] модели. Следовательно, MVC оказывает влияние на проверку. Поэтому я бы предположил, что в MVC есть способ исправить это (см. Это в должности). Пожалуйста, опубликуйте ответы для asp.net ядро 2.0.

Оригинальное Сообщение

на странице MVC5 я визуализирую Double свойство в текстовом поле. Когда страница загружается, значение отображается с", " как десятичный разделитель, что является правильным, так как страница работает в немецкой системе. Если я хочу сохранить форму,я получаю ошибку проверки. Как это можно решить? Я знаю, что есть какие-то вопросы по этой теме, но насколько я вижу, большинство из них устаревший... Я все еще борюсь, что нет никаких настроек или чего-либо встроенного, что позволяет пользователям из разных стран работать с приложениями MVC.

модель:

[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]
public Double Gewicht
{
    get { return gewicht; }
    set { gewicht = value; OnPropertyChanged(new PropertyChangedEventArgs("Gewicht")); }
}

cshtml по:

<div class="form-group">
    @Html.LabelFor(model => model.Gewicht, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-8">
        @Html.EditorFor(model => model.Gewicht, new { htmlAttributes = new { @class = "form-control col-md-1" } })
        @Html.ValidationMessageFor(model => model.Gewicht, "", new { @class = "text-danger" })
    </div>
</div>

Web.config

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

поле после его загрузки --> значение, загруженное запятой в качестве десятичного разделителя enter image description here

поле после нажатия кнопки отправки --> ошибка проверки для того же значение

enter image description here

поле после запятой изменяется на point -- > нет ошибки проверки enter image description here

обновление 05.01.2018

Я пробовал показанное решение здесь которые, к сожалению, не работает для меня. Однако я также обнаружил, что значения не только не получают acceptet, но также изменяются на числа, где смешиваются разделитель групп и десятичный разделитель (см. рисунок). Происходит то, что значение 22 изменяется на 22.5 и сохраняется в базе данных. В результате получается, что значение 2,250.00 хранится в базе данных.

enter image description here

07.01.2018 обновление

что также интересно, так это то, что поля даты принимают немецкий формат совершенно нормально.

свойства

private DateTime? inbetriebnahmedatum;

[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? Inbetriebnahmedatum
{
    get { return inbetriebnahmedatum; }
    set { inbetriebnahmedatum = value; OnPropertyChanged(new PropertyChangedEventArgs("Inbetriebnahmedatum")); }
}

значение, показанное ниже, принимается и обрабатывается без каких-либо ошибки. enter image description here

обновление 07.01.2018-2

если я изменю строку в edit.cshtml по С

<input asp-for="Gewicht" class="form-control" />

to

<input name="Gewicht" id="Gewicht" type="number" class="form-control" value="@Model.Gewicht"/>

форма может быть отправлена со значением "23,7"без ошибок проверки. В контроллере свойство связанной модели показывает значение "237", где в качестве IFormCollection показывает значение "23.7". Это предполагает проблему с модельным связующим.

2 ответов


хотя было высказано предположение, что это скорее проблема jQuery, чем проблема MVC, я думаю, что это проблема MVC.

нет это не правильно. Вы видите ошибку проверки на стороне клиента, потому что по умолчанию jquery.validate.js (независимый сторонний плагин, не связанный с MicroSoft, который MVC использует для проверки на стороне клиента) проверяет числа на основе десятичного разделителя, являющегося . (точка), а не , (запятая).

MVC-это серверный код и не запускается в браузере. Чтобы выполнить проверку на стороне клиента, MVC HtmlHelper методы, которые генерируют элементы управления формы, отображают набор data-val-* атрибуты в html, используемые для описания проверки, которая будет выполнена, которые в свою очередь анализируются jquery.validate.unobtrusive.js плагин при загрузке DOM и использует их для добавления правил в $.validator.

в случае double свойство он добавит data-val-number атрибут (в дополнение к data-val-required атрибут), который добавит number правила, которое определяется как

// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function( value, element ) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
},

где десятичный разделитель-точка, а разделитель тысяч-запятая (предположительно, потому, что плагин был разработан в США, поэтому использует формат США).

вам нужно перезаписать поведение по умолчанию, которое вы можете сделать с помощью плагинов, таких как С помощью jQuery.глобализировать, или включая следующий скрипт (обратите внимание, что регулярное выражение просто меняет точку и запятую)

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

обратите внимание, что выше сценарий должен после jquery.validate.js сценарий, но не завернутый в $(document).ready()

что связывает его с MVC для меня, это тот факт, что я могу решить проблему проверки даты, добавив строку [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] модели.

на самом деле ваш [DataType(DataType.Date)] атрибут в сочетании с [DisplayFormat] атрибут, который влияет на html, который генерируется. The создает <input type="date" ... /> который в свою очередь отображает браузеры HTML - 5 datepicker, если браузер поддерживает он. В соответствии со спецификациями формат должен быть yyyy-MM-dd (формат ISO) следовательно потребность для [DisplayFormat] атрибут, а также.

datepicker HTML-5 отображает дату в культуре браузеров. Изображение, которое вы показали, где вход 26.1.2018 - это потому, что ваша культура обозреватель de-DE, но если бы я перешел на ваш сайт, я бы увидел 26/1/2018 на входе, потому что моя культура en-AU (Australian), и если пользователь Соединенных Штатов перешел на ваш сайт, они см.1/26/2018.

причина, по которой проверка на стороне клиента работает для свойства date, заключается в том, что jquery.validate.js плагин включает в себя правила даты для обоих форматов США (MM/dd/yyyy) и формат ISO (yyyy-MM-dd).

если вы используете @Html.TextBoxFor(m => m.Inbetriebnahmedatum) (который игнорирует ваши [DataType] и [DisplayFormat] атрибуты), и вошел 26.1.2018 на входе вы также увидите ошибку проверки на стороне клиента.


Я думаю, что проблема в валидаторе jquery я использовал таким образом, для устранения ошибки запятая/точка

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

просто попробуйте поиграть с ним