Десятичное значение разделителя тысяч преобразуется в 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" { получить; набор; }
общественного строка имени { получить; набор; }
}
}