Просто поместите данные сериализации в формат "application / json; charset = utf-8" в MVC3 (и, возможно, в более старых версиях). То, что происходит, - это все числа со значениями NULL, заканчивающимися нулями, а числа типа «десятичные» заканчиваются на 0, когда сериализуют их внутри объекта javascript (в JSON) и оставляют их как числа, а не строки.
Вот пример кода, который иллюстрирует это неправильное поведение
- - - этот пример был создан с использованием jquery-1.4.4.js и jquery.json-2.2.js - - - -
HomeController.cs:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.SaveUrl = Url.Action("Save", "Home", new { inspectionFormID = Guid.Empty }, Request.Url.Scheme);
return View();
}
public JsonResult Save(Guid inspectionFormID, JsonTest result)
{
return Json(result);
}
public class JsonTest
{
public double Double { get; set; }
public double? DoubleNull { get; set; }
public decimal Decimal { get; set; }
public decimal? DecimalNull { get; set; }
public Double Double2 { get; set; }
public Double? Double2Null { get; set; }
public Decimal Decimal2 { get; set; }
public Decimal? Decimal2Null { get; set; }
public Single Single { get; set; }
public Single? SingleNull { get; set; }
public float Float { get; set; }
public float? FloatNull { get; set; }
public int Int { get; set; }
public int? IntNull { get; set; }
public Int64 Int64 { get; set; }
public Int64? Int64Null { get; set; }
}
}
Index.cshtml:
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<b>@ViewBag.SaveUrl</b>
<br />
<hr />
<br />
<h3>Integral Numbers</h3>
<button type="button" class="a">Clicky</button>
<div></div>
<h3>Decimal Numbers (xx.0)</h3>
<button type="button" class="b">Clicky</button>
<div></div>
<h3>Decimal Numbers (xx.5)</h3>
<button type="button" class="c">Clicky</button>
<div></div>
<h3>Integral Numbers as strings</h3>
<button type="button" class="d">Clicky</button>
<div></div>
<h3>Decimal Numbers as strings (xx.5)</h3>
<button type="button" class="e">Clicky</button>
<div></div>
<script type="text/javascript">
$(function () {
var saveUrl = '@ViewBag.SaveUrl';
var printObj = function (inObj, destx) {
var dest = $('<table>').appendTo(destx),
dst1 = $('<tr>').appendTo(dest),
dst2 = $('<tr>').appendTo(dest);
for (var p in inObj) {
$('<th>', { text: p, css: { color: 'red', padding: '3px', background: '#dedede' } }).appendTo(dst1);
$('<td>', { text: inObj[p] || 'null' }).appendTo(dst2);
}
};
$('button.a').click(function () {
var curr = $(this).next(),
outR = {
Double: 12,
DoubleNull: 13,
Decimal: 14,
DecimalNull: 15,
Double2: 16,
Double2Null: 17,
Decimal2: 18,
Decimal2Null: 19,
Single: 20,
SingleNull: 21,
Float: 22,
FloatNull: 23,
Int: 24,
IntNull: 25,
Int64: 26,
Int64Null: 27
};
$('<hr />').appendTo(curr);
printObj(outR, curr);
$.ajax({
type: 'POST',
url: saveUrl,
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: $.toJSON({
inspectionFormID: 'fbde6eda-dde6-4ba9-b82d-3a35349415f0',
result: outR
}),
error: function (jqXHR, textStatus, errorThrown) {
alert('save failed');
},
success: function (data, textStatus, jqXHR) {
printObj(data, curr);
}
});
});
$('button.b').click(function () {
var curr = $(this).next(),
outR = {
Double: 12.0,
DoubleNull: 13.0,
Decimal: 14.0,
DecimalNull: 15.0,
Double2: 16.0,
Double2Null: 17.0,
Decimal2: 18.0,
Decimal2Null: 19.0,
Single: 20.0,
SingleNull: 21.0,
Float: 22.0,
FloatNull: 23.0,
Int: 24.0,
IntNull: 25.0,
Int64: 26.0,
Int64Null: 27.0
};
$('<hr />').appendTo(curr);
printObj(outR, curr);
$.ajax({
type: 'POST',
url: saveUrl,
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: $.toJSON({
inspectionFormID: 'fbde6eda-dde6-4ba9-b82d-3a35349415f0',
result: outR
}),
error: function (jqXHR, textStatus, errorThrown) {
alert('save failed');
},
success: function (data, textStatus, jqXHR) {
printObj(data, curr);
}
});
});
$('button.c').click(function () {
var curr = $(this).next(),
outR = {
Double: 12.5,
DoubleNull: 13.5,
Decimal: 14.5,
DecimalNull: 15.5,
Double2: 16.5,
Double2Null: 17.5,
Decimal2: 18.5,
Decimal2Null: 19.5,
Single: 20.5,
SingleNull: 21.5,
Float: 22.5,
FloatNull: 23.5,
Int: 24.5,
IntNull: 25.5,
Int64: 26.5,
Int64Null: 27.5
};
$('<hr />').appendTo(curr);
printObj(outR, curr);
$.ajax({
type: 'POST',
url: saveUrl,
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: $.toJSON({
'inspectionFormID': 'fbde6eda-dde6-4ba9-b82d-3a35349415f0',
'result': outR
}),
error: function (jqXHR, textStatus, errorThrown) {
alert('save failed');
},
success: function (data, textStatus, jqXHR) {
printObj(data, curr);
}
});
});
$('button.d').click(function () {
var curr = $(this).next(),
outR = {
Double: '12',
DoubleNull: '13',
Decimal: '14',
DecimalNull: '15',
Double2: '16',
Double2Null: '17',
Decimal2: '18',
Decimal2Null: '19',
Single: '20',
SingleNull: '21',
Float: '22',
FloatNull: '23',
Int: '24',
IntNull: '25',
Int64: '26',
Int64Null: '27'
};
$('<hr />').appendTo(curr);
printObj(outR, curr);
$.ajax({
type: 'POST',
url: saveUrl,
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: $.toJSON({
'inspectionFormID': 'fbde6eda-dde6-4ba9-b82d-3a35349415f0',
'result': outR
}),
error: function (jqXHR, textStatus, errorThrown) {
alert('save failed');
},
success: function (data, textStatus, jqXHR) {
printObj(data, curr);
}
});
});
$('button.e').click(function () {
var curr = $(this).next(),
outR = {
Double: '12.5',
DoubleNull: '13.5',
Decimal: '14.5',
DecimalNull: '15.5',
Double2: '16.5',
Double2Null: '17.5',
Decimal2: '18.5',
Decimal2Null: '19.5',
Single: '20.5',
SingleNull: '21.5',
Float: '22.5',
FloatNull: '23.5',
Int: '24.5',
IntNull: '25.5',
Int64: '26.5',
Int64Null: '27.5'
};
$('<hr />').appendTo(curr);
printObj(outR, curr);
$.ajax({
type: 'POST',
url: saveUrl,
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: $.toJSON({
'inspectionFormID': 'fbde6eda-dde6-4ba9-b82d-3a35349415f0',
'result': outR
}),
error: function (jqXHR, textStatus, errorThrown) {
alert('save failed');
},
success: function (data, textStatus, jqXHR) {
printObj(data, curr);
}
});
});
});
</script>
Запустите его, нажмите каждую кнопку один раз и посмотрите на «до / после». Заранее благодарим за понимание, исправление или помощь, которую вы можете оказать для решения этой проблемы.
Вы также можете скачать примеры кода, перечисленные выше, и посмотреть официальный отчет об ошибке по этой ссылке: http://aspnet.codeplex.com/workitem/8114
<ч />
РЕДАКТИРОВАТЬ: я включаю это изображение, чтобы помочь всем понять, что здесь происходит
нажмите здесь, чтобы увидеть скриншот включенного примера с запущенным
В основном: {propertyThatIsADecimal: 54} становится {propertyThatIsADecimal: 0} на сервере для нескольких различных типов чисел в различных сценариях, которые, кажется, не имеют смысла или причины.