【发布时间】: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