ASP.Net MVC5控制器中如何返回含列表的匿名类型JsonResult?
在ASP.NET MVC 5中返回包含嵌套集合的匿名类型Json数据
我来帮你搞定这个问题!你需要把包含嵌套地址集合的customer列表转换成匿名类型再返回Json,具体可以按照以下步骤来实现:
首先,先确认你的customer类定义(你已经给出了,这里再贴出来方便参考):
public class customer { public int custId {get; set;} public string custName {get; set;} public virtual ICollection<address> addresses{ get; set; } }
接下来是完整的GetData方法实现,这里会处理嵌套的addresses集合,同时避免常见的序列化问题:
public JsonResult GetData() { // 重点:如果使用Entity Framework,一定要用Include提前加载addresses集合 // 防止延迟加载导致序列化时上下文已释放,取不到地址数据 var myData = _myService.GetAll() .Include(c => c.addresses) .ToList(); // 构建包含所需字段的匿名类型,同时处理嵌套的addresses var jsonResponse = myData.Select(customer => new { customer.custId, customer.custName, // 对addresses集合也做匿名类型转换,只返回需要的字段 Addresses = customer.addresses.Select(addr => new { // 这里替换成你实际的address类属性,比如addressId、street、city等 addr.addressId, addr.street, addr.city, addr.zipCode }) }); // 返回Json结果,GET请求必须加上JsonRequestBehavior.AllowGet // POST请求可以省略这个参数 return Json(jsonResponse, JsonRequestBehavior.AllowGet); }
几个需要注意的关键点:
- 提前加载嵌套集合:如果你的
_myService.GetAll()返回的是EF的IQueryable,一定要用Include(c => c.addresses)来预加载地址集合,否则序列化时可能会因为延迟加载上下文已释放而抛出异常。 - 自定义匿名类型字段名:如果想修改返回的字段名,比如把
custName改成CustomerName,只需要写成CustomerName = customer.custName即可。 - GET请求的Json权限:MVC默认禁止GET请求返回Json(防止JSON劫持),所以GET请求必须加上
JsonRequestBehavior.AllowGet;如果是POST请求,则可以省略这个参数。 - 多层嵌套处理:如果
address类还有其他嵌套集合,同样可以用嵌套的Select来继续构建对应的匿名类型。
内容的提问来源于stack exchange,提问作者tcode
相关产品推荐
相关产品推荐

