Перебор коллекции Json с использованием JQuery перебирает символы строки данных

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

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 с двумя объектами. Однако функция jquery $.each затем продолжает перебирать каждый символ в строке, поэтому я получаю 46 окон предупреждений: первое говорит «[», затем «{», затем «»», затем «M», затем «a ', затем 'к'... вы поняли.

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

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


person James Allen    schedule 07.08.2009    source источник


Ответы (3)


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

$.post("/Home/GetCars", null, 
    function(cars)
    {
         $(cars).each(function() {
             alert(this); //this should point to the car. 
         });
    },
   "json"
);
person Nick Riggs    schedule 07.08.2009
comment
я пытался использовать ваш код, когда в коллекции есть один элемент, он работает хорошо. но когда коллекция имеет более одного значения, функция обратного вызова не выполняется - person Kobi; 19.04.2014

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

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

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

person Sean Clark Hess    schedule 07.08.2009
comment
Вы получили тот же ответ, что и Ник, но он пришел первым, поэтому я отметил его как ответ :( Спасибо за ваш ответ! - person James Allen; 07.08.2009

текст ссылки

$.post("/Home/GetCars", null, 
    function(cars)
    {
         $.each(cars, function() {
              alert(this.Make);
         });
    },
   "json"
);
person andres descalzo    schedule 07.08.2009
comment
Спасибо, мне не хватало json (один раз попробовал, не получилось, потом перечитал ответы и понял, что попал не в то место, после вызова $.each) - person James Allen; 07.08.2009