Возврат сложных типов (несколько списков) на сторону клиента с использованием jquery.ajax - PullRequest
4 голосов
/ 08 февраля 2011

Я разрабатываю страницу, которая выполняет вызов ajax (через jQuery.ajax) для метода страницы на стороне сервера.
На стороне сервера у меня есть два класса: Agent и Channel.
В методе page я хотел бы вернуть 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 ]

3 голосов
/ 08 февраля 2011

Контейнерный класс работает достаточно хорошо. Часто в конечном итоге вы захотите включить несколько дополнительных элементов на верхнем уровне, и тогда класс контейнера будет полезен.

Если вам не нравится дополнительный класс, вы можете использовать анонимный тип, чтобы избежать класса контейнера:

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.
  }
});
3 голосов
/ 08 февраля 2011

Код контроллера

  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.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 голос
/ 08 февраля 2011

Вы не указали детали вашего вызова jQuery.ajax ... вы можете найти лучший ответ, если сможете предоставить более подробную информацию.

Предполагая, что вы делаете запрос GET, вы можете заключить свои списки в объект JSON.Сериализация JSON потребует гораздо меньшей пропускной способности, чем аналоги сериализации HTML / XML.Затем, с точки зрения доступа на стороне клиента, вы будете иметь дело с литералом объекта:

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

Используя ваш результат JSON, вы можете использовать стандартный JavaScript для / в синтаксисе для перебора списков агентов и каналов..

Невозможно сказать, есть ли "лучший" подход, не зная деталей вашей ситуации, но, похоже, вы уже на правильном пути.

1 голос
/ 08 февраля 2011

Как прокомментировал @igorw, лучший способ управлять им - заключить их в объект JSON. Самый простой способ сделать это было бы что-то вроде ...

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

Это отправляет вам код обратно в дружественном для javascript формате и сохраняет два списка разделенными на две части, так что вы можете просмотреть любой из них с помощью javascript и при этом знать, какой из них какой.

...