【问题标题】:asp.net mvc3 return multiple json listasp.net mvc3 返回多个json列表
【发布时间】:2012-06-07 20:02:12
【问题描述】:

我的 asp.net mvc3 c# 代码返回这样的 json 列表:

return Json(new { name = UserNames, imageUrl = ImageUrls });

UserNamesImageUrls 都是 List<string> 类型

这是我的javascript

function StartSearch(text) {
    $.ajax({
        url: '/Shared/Search',
        type: 'POST',
        data: { SearchText: text },
        dataType: 'json',
        success: function (result) {
            $.each(result, function (i, item) {
                alert(result[i].name);
            });
        }
    });
}

如何获取姓名和ImageUrls

谢谢

【问题讨论】:

    标签: c# jquery ajax asp.net-mvc-3


    【解决方案1】:

    访问名称作为结果的属性,例如result.name[i]

    本质上,result 将包含 name 和 imageUrl 这两个数组,就像你在匿名类型中定义的一样,所以你的代码应该像这样修改,以显示 name 数组中每个名称的警报

    function StartSearch(text) {
        $.ajax({
            url: '/Shared/Search',
            type: 'POST',
            data: { SearchText: text },
            dataType: 'json',
            success: function (result) {
                $.each(result.name, function (i, item) {
                    alert(item);
               });
            }
        });
    }
    

    $each 遍历名称数组中的项目时,它会将项目传递给回调的第二个参数,即项目。

    所以

    $.each(result.name, function (i, item) {
        alert(item);
    });
    

    会弹出每个名字。

    注意事项:

    您可能希望更改匿名类型的属性以反映它们是一个集合:

    return Json(new { UserNames = UserNames, ImageUrls = ImageUrls });
    

    这样,当您在成功函数中迭代它们时,它会更有意义。

    正如 AlfalfaStrange 指出的那样,我没有演示如何访问这两个数组。这让我想到,用户名和图片url有什么关系?

    这是用户的图像列表吗?也许您应该考虑为此创建一个特定的模型。例如,UserDisplayModel:

    public class UserDisplayModel
    {
        public string UserName {get;set;}
        public string ImageUrl {get;set;}
    }
    

    在您的控制器中返回一个 UserDisplayModels 列表。如果是这种情况,您将不得不重新考虑为什么它们首先是两个单独的列表。也许 ImageUrl 应该是 User 表上的一个字段。

    所以现在,当您返回单个列表时,例如

    List<UserDisplayModel> users = //get users from db
    return Json(new { Users = Users});
    

    您可以在 js 代码中一次性迭代它们:

           $.each(result.Users, function (i, item) {
                alert(item.Name);
                alert(item.ImageUrl);
            });
    

    【讨论】:

    • 对改进 OP 的预期表示赞赏。打得很好。
    【解决方案2】:

    这会从每个列表的每条记录中提醒Name 的值。

    $.each(result, function (i, item) {
        for (var x = 0; x < result.FirstList.length; x++) {
            alert(result.FirstList[x].Name);
            alert(result.SecondList[x].Name);
        }
    });
    

    这假定您的 Json 响应格式正确。像这样:

    return Json(new { FirstList = results, SecondList = otherResults }, JsonRequestBehavior.AllowGet);
    

    但作为旁注,我发现您的代码存在其他需要解决的问题

    1. 您实际上并没有执行POST,而是根据输入进行搜索。在您的 Ajax 调用中将 POST 更改为 GET
    2. 更改您的操作返回行以允许获取并确保您返回的是JsonResult
    3. C# 方法参数的命名约定要求使用 Pascal 大小写。第一个字符使用小写字母

      public JsonResult Search(string searchText) {
          ....
          return Json(new { name = UserNames, imageUrl = ImageUrls }, JsonRequestBehavior.AllowGet);
      }
      

    【讨论】:

    • 你真的需要在 $.each 中这样做吗? “for”语句不能直接在成功中吗?同意将 POST 更改为 GET。
    • .each方法中,i是每个列表对象,所以在result上调用.each只会遍历结果,所以第一个对象是第一个列表,下一个对象是下一个列表。因此,要遍历每个列表中的项目,需要第二个循环。例如,在我的测试中,.each(result, function(i, item( { alert[i]; } 给出了每个列表的名称,在我的例子中是 FirstListSecondList
    • 在您的情况下,您没有对 i 或 item 执行任何操作,因此您可以删除 $each,并使用“for”进行迭代,我的第一个响应传入 result.name - name是一个数组,所以 $.each(result.name,... alert(item); 应该可以工作
    • 是的,你的工作是遍历名称列表,但随后绕过imageUrl 列表。所以我想这只是语义,要么你在result.name上调用.each,然后在result.imageUrl上调用.each,或者你在result上调用.each,然后在每个列表
    • 嗯,它是 Json,所以从技术上讲它是一个字典列表,它是一个结果列表,因为 OP 返回 2 个东西,一个名称列表和一个 Url 列表。所以就像我说的,在我的测试中,.each on just result 给出了每个返回对象的名称、名称和 imageUrls。因此,要遍历每个列表,您在 result.name 上调用 .each,然后在 result.imageUrls 上进行第二次调用。如果您想查看,我可以更新我正在测试的 GitHub 项目
    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2012-05-23
    • 2013-02-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2012-08-01
    • 2015-02-06
    相关资源
    最近更新 更多