通过JSON传递集合

时间:2014-09-11 15:38:56

标签: c# jquery json linq

我从Jquery调用以下操作。当我查看"数据"值显示预期信息,包括地址集合。但是当我把它作为JSon传递给我的JQuery时,Addresses集合是空的。是否可以在My 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设置导致了问题。有关将序列化程序设置为只对循环进行深度调整的方法的任何想法吗?

2 个答案:

答案 0 :(得分:1)

尝试:

      select new { 
            i.ID, 
            value = i.Name, 
            i.Website
            ,Addresses = pa.ToArray()
         })
        .Take(10).ToArray();

答案 1 :(得分: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这样的库,这使得事情变得非常容易。在Address类中定义属性时,您只需要删除[JsonProperty]属性。像这样的东西 -

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

您可以将Address对象移交给序列化。