我正在尝试从每个对象中获取名称和ID字段,但字段显示为未定义。
function OnHistoricalListBoxLoad(historicalListBox) {
$.getJSON('GetHistoricalReports', function (data) {
historicalListBox.trackChanges();
$.each(data, function () {
var listBoxItem = new Telerik.Web.UI.RadListBoxItem();
listBoxItem.set_text(this.Name);
listBoxItem.set_value(this.ID);
historicalListBox.get_items().add(listBoxItem);
});
historicalListBox.commitChanges();
});
}
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetHistoricalReports()
{
List<HistoricalReport> historicalReports = DashboardSessionRepository.Instance.HistoricalReports;
var viewModel = historicalReports.Select(report => new
{
ID = report.ID,
Name = report.Name
}).ToArray();
return Json(viewModel, JsonRequestBehavior.AllowGet);
}
我知道我正在成功返回数据,并且我知道有有效数据。我是MVC / JavaScript的新手,但是我检查了区分大小写以确保我不会犯一个简单的错误,但它似乎不是问题。我错过了一些更复杂的东西吗?
检查Chrome中的HTTP响应JSON选项卡我看到:
0:{ID:1,姓名:PUE} 1:{ID:2,名称:重量} 2:{ID:3,名称:Power Actual vs Max} 3:{ID:4,名称:Power Actual}
答案 0 :(得分:2)
不知道,但将这些巨大的域模型传递给视图是非常糟糕的做法。这是一个有点被污染的领域,它在视图中无关。在视图中,您使用视图模型。视图模型仅包含视图所需的内容。在这种情况下,您的视图需要ID和名称。因此,只将那些单个简单属性的视图模型传递给此视图:
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetHistoricalReports()
{
var reports = DashboardSessionRepository.Instance.HistoricalReports;
var reportsViewModel = reports.Select(x => new
{
ID = x.ID,
Name = x.Name
}).ToArray();
return Json(reportsViewModel, JsonRequestBehavior.AllowGet);
}
现在,您不仅可以节省带宽,还可以获得一些干净的JSON:
[ { ID: 1, Name: 'Foo' }, { ID: 2, Name: 'Bar' }, ... ]
您可以使用$.each
循环。
更新:
现在您已经显示了JSON数据,似乎有一个代表集合的Content
属性。所以你需要遍历它:
$.each(data.Content, ...);
如果您按照我对视图模型的建议,您的控制器操作将变为如下:
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetHistoricalReports()
{
var report = DashboardSessionRepository.Instance.HistoricalReports;
var reportsViewModel = report.Content.Select(x => new
{
ID = x.ID,
Name = x.Name
}).ToArray();
return Json(reportsViewModel, JsonRequestBehavior.AllowGet);
}
现在直接遍历返回的集合:
$.each(data, ...);