使用JSON数据..为什么我的对象的所有属性都未定义?

时间:2011-06-22 21:08:52

标签: json asp.net-mvc-2

我正在尝试从每个对象中获取名称和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}

1 个答案:

答案 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, ...);