JSON 传递给 MVC Rest 接口时数组为空
JSON Array is null when passed to MVC Rest interface
我正在尝试传递一个 JSON 对象,该对象包含通用字符串属性和具有属性的对象数组。
模型对象:
public class Stock
{
public IEnumerable<Daily> DailyList;
public string Symbol { get; set; }
public double PERatio { get; set; }
}
public class Daily
{
public double EndOfDayPrice { get; set; }
public int Volume { get; set; }
public double DayDiff { get; set; }
}
以下是我的 HomeController 代码:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public JsonResult Dump()
{
Stock s = new Stock()
{
Symbol = "YHOO",
PERatio = 4.31,
DailyList = new List<Daily>()
{
new Daily {EndOfDayPrice = 4.13, DayDiff = 1.2, Volume = 15000 },
new Daily {EndOfDayPrice = 4.1, DayDiff = .5, Volume = 1300 }
}
};
return Json(s, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public JsonResult ProcessDataReturned(Stock stock)
{
stock = stock;
// int count = mylist.Length;
return Json("success");
}
}
这是我的 JavaScript 在我的页面上:
function calculate(pricelist) {
var count = 1; //skip first;
var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, "DayDiff": 1.2 }, { "EndOfDayPrice": 4.1, "Volume": 1300, "DayDiff": 0.5 }], "Symbol": "YHOO", "PERatio": 4.31 };
$.post("/home/ProcessDataReturned/", teststring).done(function (data2) { document.write(data2 + "<hr>"); });
//Tried with the JSON.stringify also.
$.post("/home/ProcessDataReturned/", JSON.stringify(teststring)).done(function (data2) { document.write(data2 + "<hr>"); });
}
当我转到控制器并观察来自 DailyList 数组的值时,它始终为空。其他属性没问题。我试图让模型(C#)同时使用 IList 和 IEnumerable 作为 属性.
贡献者建议的新代码。我仍然有同样的问题。 Array 仍然是空的(不是 null 因为我在构造函数中初始化它)。
var x = JSON.stringify({ stock: teststring });
//Other variations I have tried
//var x = JSON.stringify(teststring);
$.ajax({
url: '@Url.Action("ProcessDataReturned", "home")',
data: x,
type: 'POST',
traditional:true,
contentType: "application/json; charset=utf-8",
success: function (data) {
$('#message').html("Reason was updated");}
});
解决方法:因为实际上有好几处错了,所以我给了每个人一个信任。此外,我自己发现了一个错误。
1. 我必须使用 ajax 调用的长格式版本。即使用 $.ajax 而不是 $.post
2. 我在服务器上的模型设置不正确。我需要将“{get;set;}”添加到列表的 属性 声明中。我犯了一个愚蠢的错误,下面的代码让我看到了这个问题。
public class 股票
{
//public IEnumerable DailyList;
//把这个改成这个(愚蠢的错误):
public IEnumerable DailyList {get;set;};
public 字符串符号 { 得到;放; }
public 双 PERatio { 得到;放; }
}
因为您的 collection 项目没有使用索引器正确命名,您需要使用 ajax()
和 traditional: true
。
var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, ....}
$.ajax({
type: 'POST',
url: '@Url.Action("ProcessDataReturned", "home")', // do not hard code your urls
traditional: true,
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ stock: teststring }),
....
})
请注意,如果您的 javascript object 是
{ DailyList[0].EndOfDayPrice: 4.13, DailyList[0].Volume: 15000, ..., DailyList[1].EndOfDayPrice: 4.1, DailyList[1].Volume: 1300, ...}
然后 object 将使用代码中的 $.post()
方法绑定
编辑
您的 Stock
class 没有 DailyList
(它的一个字段)的 属性,因此默认模型活页夹无法设置值。将其更改为 属性
public IEnumerable<Daily> DailyList { get; set; }
我正在尝试传递一个 JSON 对象,该对象包含通用字符串属性和具有属性的对象数组。
模型对象:
public class Stock
{
public IEnumerable<Daily> DailyList;
public string Symbol { get; set; }
public double PERatio { get; set; }
}
public class Daily
{
public double EndOfDayPrice { get; set; }
public int Volume { get; set; }
public double DayDiff { get; set; }
}
以下是我的 HomeController 代码:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public JsonResult Dump()
{
Stock s = new Stock()
{
Symbol = "YHOO",
PERatio = 4.31,
DailyList = new List<Daily>()
{
new Daily {EndOfDayPrice = 4.13, DayDiff = 1.2, Volume = 15000 },
new Daily {EndOfDayPrice = 4.1, DayDiff = .5, Volume = 1300 }
}
};
return Json(s, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public JsonResult ProcessDataReturned(Stock stock)
{
stock = stock;
// int count = mylist.Length;
return Json("success");
}
}
这是我的 JavaScript 在我的页面上:
function calculate(pricelist) {
var count = 1; //skip first;
var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, "DayDiff": 1.2 }, { "EndOfDayPrice": 4.1, "Volume": 1300, "DayDiff": 0.5 }], "Symbol": "YHOO", "PERatio": 4.31 };
$.post("/home/ProcessDataReturned/", teststring).done(function (data2) { document.write(data2 + "<hr>"); });
//Tried with the JSON.stringify also.
$.post("/home/ProcessDataReturned/", JSON.stringify(teststring)).done(function (data2) { document.write(data2 + "<hr>"); });
}
当我转到控制器并观察来自 DailyList 数组的值时,它始终为空。其他属性没问题。我试图让模型(C#)同时使用 IList 和 IEnumerable 作为 属性.
贡献者建议的新代码。我仍然有同样的问题。 Array 仍然是空的(不是 null 因为我在构造函数中初始化它)。
var x = JSON.stringify({ stock: teststring });
//Other variations I have tried
//var x = JSON.stringify(teststring);
$.ajax({
url: '@Url.Action("ProcessDataReturned", "home")',
data: x,
type: 'POST',
traditional:true,
contentType: "application/json; charset=utf-8",
success: function (data) {
$('#message').html("Reason was updated");}
});
解决方法:因为实际上有好几处错了,所以我给了每个人一个信任。此外,我自己发现了一个错误。 1. 我必须使用 ajax 调用的长格式版本。即使用 $.ajax 而不是 $.post 2. 我在服务器上的模型设置不正确。我需要将“{get;set;}”添加到列表的 属性 声明中。我犯了一个愚蠢的错误,下面的代码让我看到了这个问题。 public class 股票 { //public IEnumerable DailyList; //把这个改成这个(愚蠢的错误): public IEnumerable DailyList {get;set;}; public 字符串符号 { 得到;放; } public 双 PERatio { 得到;放; } }
因为您的 collection 项目没有使用索引器正确命名,您需要使用 ajax()
和 traditional: true
。
var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, ....}
$.ajax({
type: 'POST',
url: '@Url.Action("ProcessDataReturned", "home")', // do not hard code your urls
traditional: true,
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ stock: teststring }),
....
})
请注意,如果您的 javascript object 是
{ DailyList[0].EndOfDayPrice: 4.13, DailyList[0].Volume: 15000, ..., DailyList[1].EndOfDayPrice: 4.1, DailyList[1].Volume: 1300, ...}
然后 object 将使用代码中的 $.post()
方法绑定
编辑
您的 Stock
class 没有 DailyList
(它的一个字段)的 属性,因此默认模型活页夹无法设置值。将其更改为 属性
public IEnumerable<Daily> DailyList { get; set; }