C# 通过JSON传递集合

C# 通过JSON传递集合,c#,jquery,json,linq,C#,Jquery,Json,Linq,我从Jquery调用以下操作。当我查看“数据”值时,它会显示预期的信息,包括地址集合。但当我将其作为JSon传递给JQuery时,Addresses集合是空的。可以在我的JSon数据中传递集合吗 [AcceptVerbs("get")] public ActionResult GetInstitutions(string term) { var data = ( from i in db.Institutions .Where(a =&g

我从Jquery调用以下操作。当我查看“数据”值时,它会显示预期的信息,包括地址集合。但当我将其作为JSon传递给JQuery时,Addresses集合是空的。可以在我的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设置导致了这个问题。有没有办法将序列化程序设置为只在循环中执行一级深度?

试试:

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

我不确定你的地址类是什么样子。但是,请确保
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))
    }
public class Address
{
   [JsonProperty]
   public string Name;
}
或者。。你可以使用像NewtonSoft这样的库,这使事情变得非常简单。在Address类中定义属性时,只需删除[JsonProperty]属性。像这样的-

select new {
           id = i.ID,
           value = i.Name,
           website = i.Website,
           addresses = pa.Select(x => new AddressDTO(x))
    }
public class Address
{
   [JsonProperty]
   public string Name;
}

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

您可以将ActionResult更改为JsonResult并返回新的JsonResult{data=data};相反,你是。上述
JsonResult
继承自
ActionResult
,因此无需更改返回类型。它还应该是
返回Json(数据,JsonRequestBehavior.AllowGet)您是否观察了Fiddler中的请求,以查看(1)是否向您的服务发出了请求,以及(2)返回了什么类型的数据?是的,我没有看到传递“地址”集合。我现在99%确定这是因为“ReferenceLoopHandling”设置。地址的数据类型是什么?