C# 通过JSON传递集合
我从Jquery调用以下操作。当我查看“数据”值时,它会显示预期的信息,包括地址集合。但当我将其作为JSon传递给JQuery时,Addresses集合是空的。可以在我的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
[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”设置。地址的数据类型是什么?