You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:45