powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как передать из формы в контроллер десятичное число?
6 сообщений из 6, страница 1 из 1
Как передать из формы в контроллер десятичное число?
    #39831850
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Простейший пример, который вызывает недоумение:
Модель:
Код: c#
1.
2.
3.
4.
5.
    public class RegionRaion
    {
        public int Id { get; set; }
        public  decimal Price { get; set; }
    }



Price - десятичное число хххххх,хх

Контроллер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    public class PriceController : Controller
    {
        [HttpGet]
        public ActionResult PriceGet()
        {
            RegionRaion regRai = new Models.RegionRaion();
            regRai.Id = 1;
            regRai.Price= 123.45M;

            return View(regRai);
        }

        [HttpPost]
        public ActionResult PriceGet(RegionRaion regRai)
        {

            return View(regRai);
        }

    }



Представление (фрагмент):

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
@using (Html.BeginForm("PriceGet", "Price", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">
        <h4>RegionRaion</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.Id)

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

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}




Попытка ввести десятичное число со знаками после запятой вводит в ступор валидатор:
"Значением поля Price должно быть число".
Он пропускает только целые числа. Одинаково не воспринимаются в качестве разделителей и точка, и запятая. Пока вижу только вариант задания этого свойства с типом строки, а проверку делать регулярным выражением.
В чём причина?
С уважением ВВГ
...
Рейтинг: 0 / 0
Как передать из формы в контроллер десятичное число?
    #39831857
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
Нашёл как эту хрень обойти.

Core:
Код: html
1.
2.
3.
4.
5.
6.
7.
.................................................................................................
            <div class="form-group">
                <label asp-for="Price" class="control-label"></label>
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
.................................................................................................



Это генерируется в HTML
Код: html
1.
2.
3.
4.
5.
            <div class="form-group">
                <label class="control-label" for="Price">Price</label>
                <input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." />
                <span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
            </div>



(часть обрезано)

Вижу что есть сгенерированный атрибут "... data-val="true" ..."
Явно в тэге прописываю его как false, то есть отменяю валидацию и всё начинает работать как надо.
.......................................................................................
Код: html
1.
<input asp-for="Price" class="form-control" data-val="false" />


.......................................................................................
Проверку на правильность ввода осуществляется регулярным выражением в определении модели:
Код: c#
1.
2.
3.
4.
.......................................................................................
        [RegularExpression(@"^\d{1,18}(\,\d\d)*$", ErrorMessage = "Ошибка ввода!")]
        public decimal Price { get; set; }
.......................................................................................
...
Рейтинг: 0 / 0
Как передать из формы в контроллер десятичное число?
    #39831868
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,

когда на хостинге окажется по умолчанию указана английская культура где десятичный разделитель точка, то заимеешь с этим проблемы так как там будет правильным число 123.45
...
Рейтинг: 0 / 0
Как передать из формы в контроллер десятичное число?
    #39832178
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUValGer,

когда на хостинге окажется по умолчанию указана английская культура где десятичный разделитель точка, то заимеешь с этим проблемы так как там будет правильным число 123.45

Согласен! Но, тут уж совсем тупой вариант, предусматривающий строковое представление в модели. А иначе ковыряйся в классах валидации - на это можно потратить всю оставшуюся жизнь.

Кстати, изложенная методика решает и застарелую проблему представления даты на форме в привычном российском варианте - 27.04.2019. Единственно, лучше не использовать хелперы типа @Html.EditorFor( ... ), а сразу оперировать с тэгом <input ... />
...
Рейтинг: 0 / 0
Как передать из формы в контроллер десятичное число?
    #39832513
Erik_Kartmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну принимай строкой и потом распарси в сеттере там в дробное число. Один хрен пост передаёт с формы что-то типа id=1&value=3.5 в виде строки, которая затем пытается надеться на класс.
...
Рейтинг: 0 / 0
Как передать из формы в контроллер десятичное число?
    #39832834
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,

по идее в mvc предусмотрено что ты будешь писать биндер модели для десятичных чисел. и кстати там успешно и . и , обработать можно.
это кстати несложно
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как передать из формы в контроллер десятичное число?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]