Javascript 如何将db对象作为复杂的Json对象返回?

Javascript 如何将db对象作为复杂的Json对象返回?,javascript,json,ajax,asp.net-mvc,serialization,Javascript,Json,Ajax,Asp.net Mvc,Serialization,我想做的是从人员列表中找到一个特定的人员。我的帖子运行良好,我在控制器中找到了我要找的人作为“chosenPerson”。在这之后,我想让那个人作为一个复杂的Json对象在我的视图中使用。但是serializer.Serialize(chosenPerson)中的某些内容似乎不起作用,我在这一行遇到了一个异常,它说: mscorlib.dll中发生“System.Reflection.TargetInvocationException”类型的异常,但未在用户代码中处理 其他信息:调用目标已引发异

我想做的是从人员列表中找到一个特定的人员。我的帖子运行良好,我在控制器中找到了我要找的人作为“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);
}

您的代码有一些问题。我建议使用
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);
});

非常确定您可以执行
返回Json(chosenPerson…
,MVC将自动为您序列化它。您可能还需要在where之后放置
.toList()
,以强制它在尝试序列化之前实际运行EF查询。@ADyson我尝试了这一操作,但出现了以下错误:检测到属性“Person”的自引用循环"chosenPerson对象是否有一个名为Person的属性,该属性也是同一类型的?请参阅此处的潜在解决方案:@ADyson谢谢,忽略对我有效的循环。如何在我的JS中检查获取是否成功?控制器中返回的对象已填充,但我在视图中获取的似乎是空对象。wat单击浏览器中的“网络”选项卡。您应该可以查看ajax请求,并可以查看返回的HTTP代码,还可以查看发送的请求和响应。但是,您的结构是错误的。您正在发送帖子,但没有对响应执行操作。相反,您可以单独获取(这是一个完全不同的请求-您必须再次提供电子邮件地址才能执行此操作)-但您的操作方法无论如何都不允许GET(由于[HttpPost]属性)。您需要处理POST请求的“成功”回调。两个单独的请求没有意义。我尝试了此操作,但出现以下错误:“已存在与此命令关联的打开的DataReader,必须先关闭它。”如上所述,添加
.ToList()
到linq查询,或将
MultipleActiveResultSets=true;
添加到您的连接字符串中。return语句现在起作用,并返回一个填充的对象。但是,接收到的对象(如果有的话)似乎是一个空对象。如何检查GET是否成功?在linq查询上放置一个断点以查看返回的内容很抱歉,响应太晚了。这个版本对我来说很有效:
string json=JsonConvert.SerializeObject(persondto,new-JsonSerializerSettings(){ReferenceLoopHandling=ReferenceLoopHandling.Ignore});返回json(json);