使用jquery.ajax将复杂类型(多个列表)返回给客户端

时间:2011-02-08 14:29:57

标签: jquery asp.net ajax list pagemethods

我正在设计一个页面,它对服务器端的页面方法进行ajax调用(通过jQuery.ajax)。
在服务器端,我有两个类:AgentChannel 在页面方法中,我想将List<Agent>List<Channel>返回给客户端。
如何将两个列表返回给客户端?应该将它们包装在一个类中,如:

public class ReturnData
  {
     public List<Agent> Agents{ get; set; }
     public List<Channel> Channels{ get; set; }
  }  

或者有更好的方法吗? 另外,如何在客户端访问这些列表的项目?像foreach(var item in Agents)这样的东西,但在客户端?

4 个答案:

答案 0 :(得分:3)

控制器代码

  public ActionResult SomeAction()
    {
        List<Agent> collectionOfAgents = //get your collection
        List<Channels> collectionOfChannels = //get your collection
        var jsonData = new
                           {
                                   Agents =collectionOfAgents,
                                   Channels = collectionOfChannels 

                           };
        return Json(jsonData);
    }

Jquery代码

                    jQuery.ajax({
                            url: '/Controller/SomeAction',
                            type: "POST",
                            dataType: "json",
                            success: function (data) {
                                var collectionOfAgents = data.Agents;
                                //iterate over agents
                                for(var a in collectionOfAgents)
                                {
                                  alert(collectionOfAgents[a]);
                                }
                                var collectionOfChannels = data.Channels;
                                //iterate over channels 
                                for(var c in collectionOfChannels)
                                {
                                  alert(collectionOfChannels[c]);
                                }
                            }
                        });

答案 1 :(得分:3)

容器类运行良好。通常,您最终也希望在顶层包含一些额外的项目,然后容器类很有用。

如果您不喜欢额外的类,可以使用匿名类型来避免容器类:

public static object GetAgentsAndChannels() {
  List<Agent> agents = GetListOfAgents();
  List<Channel> channels = GetListOfChannels();

  return new { Agents: agents, Channels, channels };
}

在客户端,它们将作为常规数组出现。您可以像这样访问它们:

$.ajax({
  url: 'YourPage.aspx/GetAgentsAndChannels',
  type: 'POST',
  dataType: 'json',
  contentType: 'application/json',
  success: function(response) {
    var agentsAndChannels = response.d;

    var numberOfAgents = agentsAndChannels.Agents.length;
    var numberOfChannels = agentsAndChannels.Channels.length;

    var firstAgent = agentsAndChannels.Agents[0];

    var firstChannelName = agentsAndChannels.Channels[0].Name;

    // Etc.
  }
});

答案 2 :(得分:1)

正如@igorw评论的那样,管理它的最佳方法是将它们包装在JSON对象中。最简单的方法就是......

return Json(new {agent = Agents, channel = Channels});

这会以javascript友好格式向您发送代码,并将两个列表分成两部分,因此您可以通过javascript逐步浏览它们,并且仍然知道哪一个是哪个。

答案 3 :(得分:1)

您遗漏了jQuery.ajax电话的详细信息......如果您能提供更多详细信息,可以找到更好的答案。

假设您正在发出GET请求,您可以将列表包装在JSON对象中。与HTML / XML序列化相比,JSON序列化所需的badnwidth要少得多。然后,就客户端访问而言,您将处理对象文字:

{  
    Agents: [ {name:"Jane"}, {name: "John"} ],
    Channels: [ {someValue: 123}, {someValue: 456} ]
}

使用您的JSON结果,您可以使用标准JavaScript for / in语法来迭代代理和频道列表。

在不了解情况细节的情况下,无法说出是否有“更好”的方法,但听起来你已经走在了正确的轨道上。