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 );
UserNames
和 ImageUrls
都是 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];
给出了每个列表的名称,在我的例子中是 FirstList
和 SecondList
。
在您的情况下,您没有对 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 中的列表的故障模型