Итерация по коллекции Json с использованием JQuery итерация по символам строки данных - PullRequest
2 голосов
/ 07 августа 2009

Я использую ASP.MVC 1, чтобы возвратить IEnumerable объектов (скажем, Cars):

public class Car : Entity<Car>
{
    public virtual string Make { get; set; }
    public virtual double Length { get; set; }
    public virtual string Colour { get; set; }
}

как это:

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult GetRoutes()
{
    IEnumerable<Car> cars = _carTask.GetCars();
    return Json(cars);
}

На моей странице я хочу перебрать каждую возвращенную машину, поэтому у меня есть это:

$.post("/Home/GetCars", null, 
    function(cars)
    {
         alert("type of object returned is " + typeof cars + ", content is " + cars);
         $.each(routes, function()
         {
              alert(this);
         });
    }
);

Когда я запускаю это, первое окно оповещения говорит:

тип объекта - строка, содержимое - [{"Make": "BMW"}, {"Make": "Ford"}]

Что говорит мне, что я получаю строку назад (не должен ли я вернуть объект?), Содержащую структуру Json с 2 объектами. Однако функция jquery $ .each затем выполняет итерацию по каждому символу в строке, поэтому я получаю 46 блоков предупреждений: первый говорит «[», затем «{», затем «», затем «M», затем «a ', тогда' k '... вы поняли.

Из того, что я прочитал, jQuery должен анализировать это как коллекцию и должен повторять только два раза, чтобы показать мне предупреждения, по одному для каждой машины. Затем я мог бы сделать предупреждение (car.Make), чтобы отобразить марки, но если я попытаюсь это сделать, я получу неопределенное значение (потому что строка не имеет свойства Make).

Что я делаю не так? Спасибо за любую помощь, должна быть очевидная ошибка, но я обещаю, что сначала я сделал много поисков и ничего не нашел! :)

Ответы [ 3 ]

6 голосов
/ 07 августа 2009

Попробуйте добавить тип "json" в качестве последнего параметра в вашем методе $ .post (). Кроме того, я думаю, вы можете упростить каждое ваше утверждение:

$.post("/Home/GetCars", null, 
    function(cars)
    {
         $(cars).each(function() {
             alert(this); //this should point to the car. 
         });
    },
   "json"
);
1 голос
/ 07 августа 2009

Вы забыли сказать jquery интерпретировать результаты как json. По умолчанию $ .post просто возвращает строку данных. Вы можете использовать один из следующих вариантов. Тогда, когда вы будете повторять, они будут объектами.

http://docs.jquery.com/Ajax/jQuery.getJSON

Или добавьте "json" в качестве последнего параметра для публикации

0 голосов
/ 07 августа 2009

текст ссылки

$.post("/Home/GetCars", null, 
    function(cars)
    {
         $.each(cars, function() {
              alert(this.Make);
         });
    },
   "json"
);
...