4

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

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

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

4

4 回答 4

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.
  }
});
于 2011-02-08T14:53:13.087 回答
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]);
                                }
                            }
                        });
于 2011-02-08T14:39:46.613 回答
1

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

假设您正在发出 GET 请求,您可以将列表包装在 JSON 对象中。JSON 序列化所需的 badnwidth 远低于 HTML/XML 序列化对应项。然后,就客户端访问而言,您将处理一个对象字面量:

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

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

在不了解您的具体情况的情况下,不可能说是否有“更好”的方法,但听起来您已经走上了正确的道路。

于 2011-02-08T14:49:08.017 回答
1

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

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

这会将代码以 javascript 友好的格式发回给您,并将两个列表分成两部分,因此您可以通过 javascript 单步执行其中一个,并且仍然知道哪个是哪个。

于 2011-02-08T14:39:31.730 回答