控制器的Json()方法不返回数组

时间:2009-04-06 17:49:01

标签: jquery asp.net-mvc json

我正在构建我的第一个MVC应用程序并遇到尝试使用AJAX / JSON执行搜索的问题。问题似乎是我的控制器返回的JSON不是一个数组,这意味着我不能使用jQuery的$ .each方法迭代我的项目。我正在尝试通过电子邮件地址搜索用户。

我有一个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),但它认为这不是一个数组。因此,$ .each循环中的$(this)是未定义的。

我从NerdDinner应用程序中借用了大量的这些,实际上看不出有什么区别。任何建议都非常感谢!

2 个答案:

答案 0 :(得分:3)

如果您要返回JSON,您是否尝试将相关数据类型参数添加到$ .post调用的参数中?

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

帖子通常会默认为Html或文字,因此它不会执行“反序列化”帖子正文所需的eval。

答案 1 :(得分:1)

我认为你需要eval()响应以使其正确。尝试类似:

$("#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
            });
        });
    });
});