Ошибка получения JSON с jQuery 1.5.1 и ASP.NET MVC V3

#javascript #asp.net #json #jquery

#javascript #asp.net #json #jquery

Вопрос:

в моем javascript я пытаюсь вызвать метод контроллера из ASP.NET Фреймворк MVC V3, на самом деле я пробовал эти оба решения:

 $.get('/Controller/Method', tourID, function (data) {
    $.each(data, function (index, listelement) {
     ...do something with listelement
    });
}, "json");


$.getJSON('/Controller/Method', null, function (data) {
    $.each(data, function (index, listelement) {
     ...do something with listelement
    });
}); 
  

Мой метод контроллера выглядит следующим образом:

 public JsonResult GetList(int id)
{
    Object obj = repository.GetObject(id);
    // obj.Stuff is an EntityCollection
    return Json(obj.Stuff, JsonRequestBehavior.AllowGet);
}
  

Моя проблема в том, что функция контроллера не будет вызвана (у меня здесь установлена точка останова). Что ж, если я удалю параметр «id», его можно вызвать, но раздел «$.each …» выполняться не будет. Как я могу отладить взаимодействие между javascript и ASP.NET что здесь происходит не так?

Заранее спасибо и с наилучшими пожеланиями,

Artjom

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

1. вам не хватает одной кавычки для закрытия /Controller/Method

2. @kjy112 Это, очевидно, не фактический код, поэтому я думаю, что это просто опечатка.

3. возможно, @lonesomeday… возможно!

Ответ №1:

Я не совсем уверен в том, как ASP.NET MVC получает параметры, но вы не можете просто передать число в качестве data аргумента $.get . Вам необходимо предоставить key=value пары, которые затем интерпретируются кодом на стороне сервера и передаются вашему методу контроллера.

Вероятно, это будет выглядеть примерно так:

 $.get('/Controller/Method', {id: tourID}, function (data) {
    $.each(data, function (index, listelement) {
     ...do something with listelement
    });
}, "json");
  

jQuery возьмет {id: tourID} и преобразует его в пары ключ-значение (здесь это было бы что-то вроде id=5 и добавит это к URL в виде строки запроса.

Если вы просто передадите число, jQuery отправит серверу пустую строку в качестве строки запроса, поэтому ваш сервер не получит информацию.

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

1. и в зависимости от того, как настроены ваши маршруты, вы также можете попробовать $.get(‘/Controller/Method/’ tourID, null, функция (данные) {}

2. @Todd действительно. Проблема в том, что на данный момент вообще не отправляются данные…

3. 1 За подсказку с {id: tourID}. Это решило проблему с вызовом действия контроллера, содержащего параметр «id»

Ответ №2:

Если JavaScript выполняется без ошибок, то сообщение фактически отправляется на ваш сервер и фактически получает ответ. Однако, если ваши параметры не совпадают с сигнатурой действия контроллеров или есть какая-то другая проблема, вы получите ответ от сервера с сообщением об ошибке. Скорее всего, это содержимое в формате HTML, предоставляющее вам информацию о сбое.

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

Ответ №3:

Я использовал плагин Firebug, чтобы найти проблему. Список, который я пытался вернуть в методе контроллера, не удалось сериализовать из-за циклических зависимостей. Я решил это, добавив атрибут [ScriptIgnore] в навигационные свойства соответствующего класса сущностей.