Member 10789927 Ответов: 0

Десятичное значение разделителя тысяч преобразуется в 0 в конце контроллера


Привет,

Недавно мы обновили наше приложение с помощью .Net Framework 4.6.1, MVC 5.2.3 и EF 6.

Мы использовали десятичные значения для хранения общего и заданного формата на уровне модели, как показано ниже

[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]
        public decimal totalSale { get; set; }


Теперь из вида я отправляю данные с помощью функции JS, как показано ниже

$.ajax({
            type: "POST",
            url: "Home/SaveHeader",
            data: $("form").serialize(),
            success: function (result)


Таким образом, эта сериализация создает проблему, в то время как значение "totalsale" равно >= 1000 - как и добавление разделителя тысяч (1000). На конце контроллера "totalsale" показывает нулевое значение.

Мы проверили старую версию, и эта функция работала нормально.

Так что любая подсказка о том, что мы здесь упускаем или что может быть причиной и\или альтернативой, чтобы исправить это, будет полезна.

Заранее спасибо.

Что я уже пробовал:

Мы попытались удалить разделитель тысяч (,) в JS перед сериализацией, и в этом случае он работает нормально.

David_Wimbley

Можете ли вы опубликовать свой код контроллера? Привязка модели следует использовать метод tryparse я думаю, но через дробь.TryParse на строке 1,000. 00 все еще преобразует ее обратно в десятичную ok, не делая ее 0.

Member 10789927

Ниже приведен код просмотра:
@model WebApplication1.Модели.TestDataModel
@{
Layout = null;
}
@использование (в формате HTML.Бигинформ("Тест", "тест", новый { идентификатор = "тест" }))
{
@Html. TextBoxFor(model => Model.totalCost)
// Кнопка ввода
тип="кнопка" значение="отправить" название="отправить" функция onclick="SaveData();" идентификатор="viewQuoteBottom" имя="viewQuote"
}

Код JS:
функция SaveData() {
Test_SaveData();
}
функция Test_SaveData() {
var sumExtCost = parseFloat ($("#totalCost"). val ()) * 1;

$("#totalCost"). val (FormatAmountWithThousandSeparator (sumExtCost. toFixed(2), ",", 30, 2, "0", правда));

$.Аякс({
тип: "пост",
url: "/ Test/SaveTestData",
данные: $("форма"). сериализация(),
успех: функция (результат) {
$("#totalCost"). val (результат);

},
ошибка: функция (данные) {

}
});


}

функция FormatAmountWithThousandSeparator(input, separator, dLen, dPlaces, defaultVal, allowNegative) {
var output = input.toString (). replace (/, / g, "");
var numRegex = /^\d+(?:\.\d\d?)?$/;
//var numRegex = /^ -? \d{2} (\.\d+)?$/;
если (allowNegative != неопределенные и усилитель; & allowNegative != нуль &амп;&амп; allowNegative == правда) {
numRegex = /^ -? \d+(?:\.\d\d?)?$/; / / ToDo: заменить новым значением RegX, которое допускает отрицательное значение.
}

if (! output. match(numRegex)) {
выход = defaultVal;
}
ещё {
output = parseFloat (выход).toFixed (dPlaces).toString();
}

if (output.длина & gt; dLen) {
output = output. substring(0, dLen);
}
выход = выход.метод toString().заменить(/\Б(?=выражение (\D{3})+(?!\г))/г, сепаратор);
обратный выход;
}


Ниже приведен код контроллера:
пространство имен WebApplication1.Контроллеры
{
публичный класс TestController : Controller
{
// GET: тест
тест общественного ActionResult ()
{
TestDataModel obj = новый TestDataModel();

obj. totalCost = 1230,45 м;
параметр obj.названием "totalprofit" = 2233.67 м;
об..Fname = " тест";


смотреть возвращение(объект);
}

public ActionResult SaveTestData(TestDataModel objTest)
{
десятичный результат = 0;
TestDataModel obj = новый TestDataModel();

результат = objTest.totalcost в;
параметр obj.названием "totalprofit" = objTest.названием "totalprofit";

return Json(result, JsonRequestBehavior.AllowGet);
}
}
}

Ниже приведена модель:
пространство имен WebApplication1.Модели
{
публичный класс TestDataModel
{

общественные TestDataModel()
{


}

[DisplayFormat(DataFormatString = " {0:n2}", ApplyFormatInEditMode = true)]
общественная десятичной totalcost в { получить; набор; }

[DisplayFormat(DataFormatString = " {0:n2}", ApplyFormatInEditMode = true)]
общественная десятичной названием "totalprofit" { получить; набор; }

общественного строка имени { получить; набор; }
}
}

0 Ответов