Результаты JSON из MVC3 не определены

#jquery #json #asp.net-mvc-3

#jquery #json #asp.net-mvc-3

Вопрос:

Я пытаюсь получить результаты JSON из действия MVC3 и поместить их в строку таблицы, но все значения не определены. Как я могу правильно проанализировать результаты JSON из запроса jQuery ajax?

Это метод действия MVC3

     [HttpPost]
    [Authorize]
    public JsonResult GetImageDetails(int id)
    {
        Image img = db.Images.First(i => i.ID == id);
        return Json(img);
    }
 

Это jQuery для обработки результатов после их возврата

     $.ajax({
        type: "POST",
        url: "../Controller/GetImageDetails",
        data: "id="   id,
        dataType: "json",
        success: function (data) {
            $.map(data, function (item) {
                $('#tblImages > tbody > tr:first').before("<tr><td>ID:"   item.ID   "</td><td><img src='"   item.ThumbURL   "' alt='"   item.Name   "'/></td></tr>");
            });
        },
        error: function (obj) {

        }
    })
 

Результатом являются строки, в которых нет ничего, кроме undefined. Я получаю столько же строк, сколько и свойств в объекте, который я возвращаю, поэтому я уверен, что я просто неправильно обрабатываю этот результат JSon. Может кто-нибудь указать мне правильное направление в том, как обрабатывать этот результат JSon, пожалуйста? Также существуют ли какие-либо проблемы с поддержкой браузера при предлагаемом подходе? Заранее спасибо!

Комментарии:

1. Как выглядит ваш Image класс? Что вы видите в Firebug?

Ответ №1:

Похоже, вы пытаетесь использовать $.map для одного объекта. Я думаю, что это приведет к повторению ключей свойств этого объекта. Попробуйте просто получить доступ к свойствам объекта из объекта данных

 $.ajax({
        type: "POST",
        url: "../Controller/GetImageDetails",
        data: "id="   id,
        dataType: "json",
        success: function (data) {
                $('#tblImages > tbody > tr:first').before("<tr><td>ID:"   data.ID   "</td><td><img src='"   data.ThumbURL   "' alt='"   data.Name   "'/></td></tr>");
        },
        error: function (obj) {

        }
    })
 

Комментарии:

1. Это сработало! Ваш человек! Я должен задаться вопросом, хотя, если изменение GET также заставило его работать? Это также все еще действует благодаря предложению Джесси. Любые рекомендации и идеи наилучшей практики будут высоко оценены!

2. Я думаю, что Get или POST будут работать и то, и другое. Если у вас есть конфиденциальная информация или большой объем информации, вы должны отправить ее по почте. Отправка формы, например, должна быть POST. GET часто используется для получения информации о сущностях. В подобных случаях вы бы дали ему некоторый идентификатор прямо в URL, например urlToMyAction?Id= 1 . Кроме того, я не уверен, будет ли свойство data проигнорировано, если вы выполнили запрос типа GET, или если jquery достаточно умен, чтобы привязать его к URL-адресу в форме, ожидаемой с запросом GET

3. Я ценю ваш вклад. Я чувствителен к различиям между get и post из-за последствий для безопасности, но вы абсолютно правы, что они оба работают.

Ответ №2:

Вы пробовали выполнять get для своего действия по сравнению с post?

например:

 [HttpGet]
[Authorize]
public JsonResult GetImageDetails(int id)
{
    Image img = db.Images.First(i => i.ID == id);
    return Json(img, JsonRequestBehavior.AllowGet);
}
 

Ответ №3:

Вы возвращаете одно изображение из своего действия, но обрабатываете его как массив на стороне клиента. Почему? Вы пытались изучить data и посмотреть, что в нем на самом деле? Я удивлен map() , что вызов вообще работает.

Также, к вашему сведению map() , предназначен для преобразования элементов данного массива. Если вы не возвращаете значение из своего обратного вызова, тогда вы должны использовать each() вместо этого.

Комментарии:

1. Вместо map() как мне получить эти данные вместо этого? Я надеялся, что смогу просто сделать данные. Например, идентификатор, но он также не определен. each() вместо map() также дает мне просто undefined .