我有一个接受如下对象的动作:
public class OrderSubmissionViewModel
{
/* Some properties trimmed for brevity */
public OrderSubmissionProductViewModel[] Products { get; set; }
}
底部属性OrderSubmissionProductViewModel数组如下所示:
public class OrderSubmissionProductViewModel
{
public int Id { get; set; }
public decimal Price { get; set; }
public int Qty { get; set; }
public decimal Tax { get; set; }
}
Javascript(淘汰赛)视图模型如下所示:
var OrderSubmissionViewModel = function (viewModel) {
var self = this;
/* Omitted Properties that parse fine */
self.Products = $.map(viewModel.productList(), function (v, i) {
return {
Id: v.Id,
Price: v.Price(),
Qty: v.Qty(),
Tax: v.Tax()
}
});
}
我有一个带有此签名的动作:
public ActionResult SubmitOrder(OrderSubmissionViewModel submission)
由以下Javascript函数使用:
self.submitOrder = function () {
var submission = new OrderSubmissionViewModel(self);
$.ajax({
url: self.urlSubmitOrder,
data: JSON.stringify({ submission: submission }),
type: 'POST',
contentType: "application/json; charset=utf-8",
success: function () { alert("Submitted"); },
fail: function () { alert("Failed"); }
});
}
由于某种原因,我的视图中通过ajax的任何形式的对象数组都没有被正确解析,我的Products属性变为空或null。其他属性(如int和字符串)可以很好地解析。
提交对象有JSON.stringify,在Fiddler中看起来像这样(为简洁起见,其他一些属性被修剪):
{"submission":{"Products":[{"Id":8888,"Price":16,"Qty":1,"Tax":1.48},{"Id":8787,"Price":8.99,"Qty":1,"Tax":0.83}]}}
如果我将JSON.stringify放在内部数组上,它看起来像:
{"submission":{"Products":"[{\"Id\":8888,\"Price\":16,\"Qty\":1,\"Tax\":1.48},{\"Id\":8787,\"Price\":8.99,\"Qty\":1,\"Tax\":0.83}]"}}
控制器不会解析任何一个!有没有人有任何想法?
答案 0 :(得分:1)
您的JSON有一个顶级属性,名为"提交"您的.NET对象没有。这将使它无法正确解析为对象,但我无法100%确定地说这就是原因。
根据您的编辑,这是我的编辑:
self.submitOrder = function () {
var submission = new OrderSubmissionViewModel(self);
$.ajax({
url: self.urlSubmitOrder,
data: JSON.stringify({ submission }),
type: 'POST',
contentType: "application/json; charset=utf-8",
success: function () { alert("Submitted"); },
fail: function () { alert("Failed"); }
});
}
答案 1 :(得分:1)
您的JSON具有属性“提交”,该属性不在您的C#对象中,因此无法对其进行解析。产品需要位于JSON对象的顶层,如下所示:
{"Products":"[{\"Id\":8888,\"Price\":16,\"Qty\":1,\"Tax\":1.48},
{\"Id\":8787,\"Price\":8.99,\"Qty\":1,\"Tax\":0.83}]"}
然后JSON结构与C#结构匹配,它应该没问题(除非你还有其他一些问题)