2014-09-11 3 views
0

Я вызываю следующее действие из JQuery. Когда я смотрю на значения «данные», он отображает ожидаемую информацию, включая сбор адресов. Но когда я передаю это как JSon в свой JQuery, коллекция адресов пуста. Можно ли передавать коллекцию в данные My JSon?Передача коллекции через JSON

[AcceptVerbs("get")] 
    public ActionResult GetInstitutions(string term) 
    { 
     var data = (from i in db.Institutions 
      .Where(a => a.Name.Contains(term)) 
      let pa = i.Addresses.Take(5)      
      select new { 
       i.ID, 
       value = i.Name, 
       i.Website 
       ,Addresses = pa 
      }) 
      .Take(10).ToArray(); 

      JsonSerializerSettings jsSettings = new JsonSerializerSettings(); 
      jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

     return Content(JsonConvert.SerializeObject(data, Formatting.None, jsSettings)); 
    } 

Из этого JQuery:

$(".autocompleteInst").autocomplete({ 
      source: "@Url.Action("GetInstitutions", "Institution")", 
      minLength: 3, 
      delay: 100, 
      select: function (event, ui) { 
       alert(ui.item.Addresses[0].Street1);         
      } 
     }); 

** Обновление ** Я добавил код конфигурации JSon в моем примере, что я оставил из первоначально. Я уверен, что настройки ReferenceLoopHandling вызывают проблему. Любые идеи о том, как установить сериализатор только на один уровень на петлях?

+0

Вы можете изменить ActionResult на JsonResult и вернуть новый JsonResult {data = data}; вместо этого? – DarthCoder

+4

Re. вышесказанное; 'JsonResult' наследуется от' ActionResult', поэтому вам не нужно менять тип возврата. Это также должно быть 'return Json (data, JsonRequestBehavior.AllowGet);' –

+0

Вы просматривали запросы в Fiddler, чтобы видеть (1), если запросы вообще выполняются к вашей службе, и (2) какие данные возвращаются ? – JLRishe

ответ

1

Я не знаю, как ваш адрес класса выглядит. Но, убедитесь, что pa сериализуем. Вы можете сделать следующее:

select new { 
     id = i.ID, 
     value = i.Name, 
     website = i.Website, 
     addresses = pa.Select(x => new { addr_id: x.Id, addr_name: x.Name }) //Whatever items you want 
} 

Вышеупомянутый вариант был бы простым. Другой вариант - использовать DTO (объекты передачи данных), которые могут быть сериализованы. Например -

class AddressDTO 
{ 
    int Id {get; set;} 
    int Name {get; set;} 

    AddressDTO(Address addr) 
    { 
     this.Id = addr.Id; 
     this.Name = addr.Name; 
    } 
} 

И тогда вы можете выбрать их, как это -

select new { 
      id = i.ID, 
      value = i.Name, 
      website = i.Website, 
      addresses = pa.Select(x => new AddressDTO(x)) 
    } 

Или .. Вы можете использовать библиотеки как NewtonSoft, что делает вещи очень легко. Все, что вам нужно сделать, это указать атрибут drop [JsonProperty], когда вы определяете свои свойства в классе Address. Что-то вроде этого -

public class Address 
{ 
    [JsonProperty] 
    public string Name; 
} 

И вы можете передать объект Address, который будет сериализован.

1

попробовать:

 select new { 
      i.ID, 
      value = i.Name, 
      i.Website 
      ,Addresses = pa.ToArray() 
     }) 
     .Take(10).ToArray(); 
Смежные вопросы