【问题标题】:How do I return db object as complex Json object?如何将 db 对象作为复杂的 Json 对象返回?
【发布时间】:2017-02-14 09:39:23
【问题描述】:

我要做的是从人员列表中获取特定人员。我的帖子工作正常,我在控制器中将我正在寻找的人作为“chosenPerson”。之后,我想将该人作为复杂的 Json 对象用于我的视图。但是 serializer.Serialize(chosenPerson) 中的某些东西似乎不起作用,我在该行收到一个异常:

在 mscorlib.dll 中出现“System.Reflection.TargetInvocationException”类型的异常,但未在用户代码中处理

附加信息:调用目标已抛出异常。"

可见的JS:

$.ajax({
    type: 'POST',
    url: '@Url.Action("ReturnPerson", "Home")',
    contentType: 'application/json; charset=utf-8',
    data: emailUnique,
    error: function (event, jqxhr, settings, thrownError) {
        console.log(event + " || " + jqxhr + " || " + settings + " || " + thrownError);
    }
});
chosenPerson = $.getJSON('/Home/ReturnPerson/');

控制器:

[HttpPost]
public ActionResult ReturnPerson(string emailUnique)
{
    var db = new CvAdminContext();
    var chosenPerson= db.Persons.Where(p => p.Email == emailUnique);
    JavaScriptSerializer serializer = new JavaScriptSerializer();

    return Json(serializer.Serialize(chosenPerson), JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 很确定你可以只做return Json(chosenPerson...,MVC 会自动为你序列化它。您可能还必须将 .toList() 放在 where 之后,以强制它在尝试序列化之前实际运行 EF 查询。
  • @ADyson 我尝试这样做并得到以下错误:“检测到属性'Person'的自引用循环”
  • selectedPerson 对象是否有一个名为 Person 的属性也属于同一类型?在此处查看潜在的解决方案:stackoverflow.com/questions/7397207/…
  • @ADyson 谢谢,忽略循环对我有用。如果 GET 成功,我如何检查我的 JS?控制器中返回的对象已填充,但我在视图中得到的似乎是一个空对象。
  • 在浏览器中观看网络标签。您应该会看到 ajax 请求,并且可以查看返回的 HTTP 代码,并查看发送的请求和响应。不过,您的结构是错误的。您正在发送 POST,但未对响应采取行动。相反,您制作了一个单独的 GET(这是一个完全不同的请求 - 您必须再次提供电子邮件地址才能执行此操作) - 但是您的操作方法无论如何都不允许 GET(由于 [HttpPost] 属性)。您需要处理 POST 请求的“成功”回调。两个单独的请求没有意义。

标签: javascript json ajax asp.net-mvc serialization


【解决方案1】:

您的代码存在一些问题。我建议使用Newtonsoft.Json 序列化Json。注意我已经删除了[HttpPost]。将您的控制器更改为:

public JsonResult ReturnPerson(string emailUnique)
{
    var db = new CvAdminContext();
    var chosenPerson= db.Persons.Where(p => p.Email == emailUnique).ToList();

    return Json(JsonConvert.SerializeObject(chosenPerson), JsonRequestBehavior.AllowGet);

}

然后从您的客户端您可以使用:

var email = "whatever@whatever.com";
// you could also use var email = @Model.Email; if view is strongly typed.

var chosenPerson = $.getJSON('/Home/ReturnPerson?emailunique=' + email, function(data) {
    console.log(data);
});

【讨论】:

  • 我尝试了这个并得到了以下错误:“已经有一个打开的 DataReader 与此命令关联,必须先关闭。”
  • 如上所述,将 .ToList() 添加到 linq 查询或将 MultipleActiveResultSets=true; 添加到您的连接字符串。
  • return 语句现在可以工作并返回一个填充的对象。然而,收到的东西,如果有的话,似乎是一个空的对象。如何检查 GET 是否成功?
  • 在 linq 查询上放一个断点以查看从 db 返回的内容。
  • 抱歉回复晚了。这个版本对我有用:string json = JsonConvert.SerializeObject(persondto, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return Json(json);
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多