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

问题描述:

我想要做的是从人员列表中获取特定人员。我的帖子工作正常,我在控制器中找到我正在寻找的人为“chosenPerson”。之后,我想让这个人成为一个复杂的Json对象,用于我的视角。但在serializer.Serialize(chosenPerson)的东西似乎不工作,我得到该行的说法异常:如何将db对象作为复杂的Json对象返回?

An exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll but was not handled in user code

其他信息:异常已通过调用的目标引发异常”

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); 
} 
+0

敢肯定你可以做'返回JSON(chosenPerson ...'和MVC会自动连载为你。你可能不得不把'.toList()'放在where之后,以强制它在尝试序列化之前运行EF查询。 – ADyson

+0

@ADyson我试着这样做,并得到以下错误:“自引用循环检测到属性'Person' – ForTheLoveOfCode

+0

selectedPerson对象是否具有名为Person的属性,它也是同一类型?请参阅此处的潜在解决方案:h ttp://stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type – ADyson

ÿ你有一些代码问题。我建议使用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 = "[email protected]"; 
// 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); 
}); 
+0

我尝试了这个,并得到以下错误: “已经有一个打开的DataReader与此命令关联,必须先关闭它。” – ForTheLoveOfCode

+0

如上所述,将'.ToList()'添加到linq查询或将'MultipleActiveResultSets = true;'添加到您的连接字符串中。 –

+0

return语句现在可以工作并返回一个填充对象。然而,接收到的东西,如果有的话,似乎是一个空洞的对象。如何检查GET是否成功? – ForTheLoveOfCode