Метод Json () контроллера не возвращает массив - PullRequest
1 голос
/ 06 апреля 2009

Я просто строю свое первое MVC-приложение и сталкиваюсь с проблемой, пытаясь выполнить поиск с использованием AJAX / JSON. Кажется, проблема в том, что JSON, возвращаемый моим контроллером, не является массивом, что означает, что я не могу использовать метод $ .each в jQuery для итерации по моим элементам. Я пытаюсь найти пользователя по адресу электронной почты.

У меня есть класс SearchController с помощью следующего метода:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SearchByEmail(string searchString)
{
  var users = new List<jsonUser>();
  foreach (I_User u in _rep.SearchByEmail(searchString))
  {
    users.Add(new jsonUser()
    {
      EmailAddress = u.EmailAddress,
      FirstName = u.Firstname,
      LastName = u.Surname,
      UserName = u.Username
    });
  }
  return Json(users);
}

, который запускается правильно и возвращает что-то, что в любом случае выглядит мне как массив JSON:

[{"EmailAddress":"foo@bar.com","UserName":"foo@bar.com","FirstName":"Foo","LastName":"Bar"}]

А потом на моей странице я получил следующий код:

$("#search").click(function(evt) {
    var emailsearch = jQuery.trim($("#email").val());
    $.post("/Search/SearchByEmail", { searchString: emailsearch },
        function(Users) {
            $("#jsonlist").text(Users); //Added to check what JSON returns.
            alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array!
            $.each(Users, function() {
                //Do stuff on each user item
            });
        });
    });
});

Добавляя закомментированные строки выше, я установил, что эта функция дает ощутимый результат (JSON опубликован выше), но она не считает, что это массив. Таким образом, $ (this) в цикле $ .each не определено.

Я заимствовал большие куски этого из приложения NerdDinner, и действительно не вижу, в чем разница. Любые предложения с благодарностью!

Ответы [ 2 ]

3 голосов
/ 06 апреля 2009

Если вы возвращаете JSON, пытались ли вы добавить соответствующий параметр типа данных в аргументы вашего вызова $ .post?

$.post("/Search/SearchByEmail", 
       { searchString: emailsearch }, callback, "json");

В сообщении обычно по умолчанию используется HTML или текст, поэтому он не выполняет оценку, необходимую для "десериализации" тела сообщения.

1 голос
/ 06 апреля 2009

Я думаю, вам нужно оценить () ответ, чтобы получить его правильно. Попробуйте что-то вроде:

$("#search").click(function(evt) {
    var emailsearch = jQuery.trim($("#email").val());
    $.post("/Search/SearchByEmail", { searchString: emailsearch },
        function(data) {
            $("#jsonlist").text(data); //Added to check what JSON returns.
            Users = eval( '(' + data + ')' );
            alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array!
            $.each(Users, function() {
                //Do stuff on each user item
            });
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...