Работа с данными JSON. Почему все свойства моего объекта не определены? - PullRequest
0 голосов
/ 23 июня 2011

Я пытаюсь получить поля Имя и Идентификатор от каждого объекта, но поля кажутся неопределенными.

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, хотя ... Я проверил чувствительность к регистру, чтобы убедиться, что я не делал просто легкую ошибку, но это, похоже, не проблема.Мне не хватает чего-то более сложного?

Проверка вкладки JSON HTTP-ответа в Chrome:

0: {ID: 1, Name: PUE} 1: {ID: 2, Name:Вес} 2: {ID: 3, Имя: Фактическая мощность против Макс.} 3: {ID: 4, Имя: Фактическая мощность}

1 Ответ

2 голосов
/ 23 июня 2011

Понятия не имею, но передача таких моделей доменов-гигантов очень плохая практика. Этот домен настолько загрязнен, что не имеет к этому никакого отношения. В представлении вы работаете с представлениями моделей. Модели представлений содержат только то, что нужно представлению. В этом случае вашему представлению нужны идентификатор и имя. Поэтому передайте модель представления только с этими простыми свойствами этому представлению:

[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.


UPDATE:

Теперь, когда вы показали свои данные 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, ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...