【问题标题】:Controller's Json() Method Not Returning Array控制器的 Json() 方法不返回数组
【发布时间】:2009-04-06 17:49:00
【问题描述】:

我正在构建我的第一个 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 应用程序中借用了其中的大部分内容,但真的看不出有什么区别。任何建议都非常感谢!

【问题讨论】:

    标签: jquery asp.net-mvc json


    【解决方案1】:

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

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

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

    【讨论】:

    • 成功了 - 解决这个问题让我头疼,因为我的调试调用 $("#jsonlist").text(Users);一旦用户是一个对象而不是一个字符串就开始失败!
    【解决方案2】:

    我认为您需要对响应进行 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
                });
            });
        });
    });
    

    【讨论】:

    • 这似乎没有帮助 - 知道为什么会这样吗?我认为 eval() 只是执行了传递的任何参数 - JSON 可执行吗?
    • eval() 会将格式正确的字符串解析为 json 对象字面量
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-08-19
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多