【问题标题】:returning collection (list) in c# as Json在c#中将集合(列表)作为Json返回
【发布时间】:2017-10-02 15:52:10
【问题描述】:

我有这样的方法:

[HttpPost]
[ActionName("GetUserData")]
public ActionResult GetUserData()
{
    using (var ctx = new myEntities())
    {
        ctx.Configuration.LazyLoadingEnabled = false;
        ctx.Configuration.ProxyCreationEnabled = false;
        var user = ctx.Users.Include("UserRoles").FirstOrDefault(x => x.UserId == 4);

        ctx.Configuration.LazyLoadingEnabled = true;
        ctx.Configuration.ProxyCreationEnabled = true;
        return Json(new
        {
            Email = user.Email,
            Roles = user.UserRoles
        }, JsonRequestBehavior.AllowGet);
    }
}

帖子是通过 jQuery 完成的,如下所示:

$.post("/Administrator/GetUserData", function (data) {
  console.log(data);
});

我正在尝试写出返回的数据,但是当我编写上述代码时,控制台显示内部错误 500...

如果返回结果是这样的:

   return Json(new
    {
        Email = user.Email
        // returning just email for example to see in console..
    },JsonRequestBehavior.AllowGet);

仅将电子邮件作为简单的字符串返回可以正常工作,但是当我尝试通过 JSON 将用户的角色作为数组返回时,我会遇到上述问题...

集合 UserRoles 的类型是 ICollection...

我在这里做错了什么?

附:伙计们,我挖出了异常,如下所示:

异常详细信息:System.InvalidOperationException:在序列化 'System.Collections.Generic.HashSet`1[[MyModel.Models.DatabaseConnection.UserRoles, MyEntity, Version=1.0.0.0, Culture 类型的对象时检测到循环引用=中性,PublicKeyToken=null]]'。

【问题讨论】:

  • 不相信你需要 ,JsonRequestBehavior.AllowGet 部分,如果它是一个帖子
  • 你得到的 500 错误是什么?
  • 你需要返回一个非循环对象。你需要从UsersRole对象得到什么信息?
  • 是的..喜欢Roles = user.UserRoles.Select(a => new {ID = a.ID, RoleName = a.RoleName}).ToList()
  • 或者你可以创建一个视图模型并填充/返回它

标签: c# jquery asp.net json asp.net-mvc


【解决方案1】:

很明显,您的角色模型包含指向导致问题的用户的属性点。

你应该选择一个匿名对象来返回

Roles = user.Roles.Select(r=> new { name = r.Name }).ToArray();

【讨论】:

  • This .ToArray() vs ToList() .. 哪个更有效? =)
  • 在这种情况下我更喜欢数组,因为你只想返回一个json,不会采取进一步的行动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2016-07-05
  • 2011-03-18
  • 2016-10-05
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多