asp.net mvc3 返回多个json列表

Posted

技术标签:

【中文标题】asp.net mvc3 返回多个json列表【英文标题】:asp.net mvc3 return multiple json list 【发布时间】: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

谢谢

【问题讨论】:

【参考方案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);

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

    您实际上并没有执行POST,而是根据输入进行搜索。在您的 Ajax 调用中将 POST 更改为 GET 更改您的操作返回行以允许获取并确保您返回的是JsonResult

    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 项目

以上是关于asp.net mvc3 返回多个json列表的主要内容,如果未能解决你的问题,请参考以下文章

使用防伪令牌将 JSON 模型发布到 ASP.Net MVC3

根据上一个列表中选择的值填充下拉列表(asp.net mvc3)

将 JSON 数组绑定到 ASP.NET MVC 3 中的列表的故障模型

ActionLink 与 ASP.NET MVC3 中的多个类

asp.net mvc3 返回原始 html 以查看

在 ASP.NET MVC3 中正确使用 TempData?