Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
При работе с данными типа decimal при использовании клиентской валидации через javascript у нас может возникнуть проблема: так как у нас русскоязычная культура, то в качестве разделителя дробной и целой частей в числах будет использоваться запятая, однако библиотеки валидации javascript при вводе дробного числа с запятой будут определять подобный ввод как ошибку. Например, у нас есть следующая модель:
public class Book { [Required] [Display(Name = "Название")] public string Name { get; set; } [Required] [Display(Name = "Цена")] [Range(typeof(decimal),"5,0", "1000,6", ErrorMessage = "Наименьшая цена - 5 рублей, в качестве разделителя дробной и целой части используется запятая")] public decimal Price { get; set; } // цена }
И представляение для создания объекта данной модели:
@model CustomProj.Models.Book @{ ViewBag.Title = "Добавить книгу"; } @using (Html.BeginForm()) { @Html.ValidationSummary(true) @Html.AntiForgeryToken() <fieldset> <legend>Новая книга</legend> <div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> <div class="editor-label"> @Html.LabelFor(model => model.Price) </div> <div class="editor-field"> @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) </div> <p> <input type="submit" value="Добавить" /> </p> </fieldset> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
В секции Scripts подключаются все необходимые для валидации скрипты. Но при валидации на стороне клиента атрибут Range не будет должным образом срабатывать и любой ввод с запятой будет считаться ошибочным. Здесь есть два решения.
Чтобы числа с запятой нормально валидировались, нам надо изменить секцию скриптов в представлении следующим образом:
@section Scripts { @Scripts.Render("~/bundles/jqueryval") <script> // переопределение валидации на стороне клиента $.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); } </script> }
С помощью данного кода javascript мы переопределяем действие библиотеки jquery.validate.js. Поэтому данный код следует помещать после включения данной библиотеки.
Мы решили по каким-то причинам отказаться от запятой в качестве разделителя и хотим использовать точку. В этом случае нам надо явно задать англоязычную культуру для приложения. Для этого переходим к файлу web.config в нашем проекте и добавляем в секцию system.web следующее определение культуры:
<globalization culture="en-US" uiCulture="en" />
Соответственно также нам надо будет в атрибуте Range устанавливать числа не с запятой, а с точкой:
[Range(typeof(decimal),"5.0", "100.6", ErrorMessage = "Наименьшая цена - 5 рублей"]