2017-02-14 84 views
0

我想要做的是從人員列表中獲取特定人員。我的帖子工作正常,我在控制器中找到我正在尋找的人爲「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

回答

0

ÿ你有一些代碼問題。我建議使用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