2017-02-14 11 views
0

То, что я пытаюсь сделать, - это получить конкретное лицо из списка лиц. Мой пост отлично работает, и я получаю человека, которого я ищу, как «selectedPerson» в контроллере. После этого я хочу, чтобы этот человек был сложным объектом 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()' после того, где, а также, чтобы заставить его фактически запускать запрос EF до того, как он попытается выполнить сериализацию. – ADyson

+0

@ADyson Я попытался сделать это и получил следующую ошибку: «Self referencing loop обнаружено для свойства «Лицо» – ForTheLoveOfCode

+0

имеет ли объект selectedPerson свойство «Личность», которое также имеет тот же тип? См. возможные решения здесь: h ttp: //stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type – ADyson

ответ

0

Y У вас есть несколько проблем с кодом. Я бы посоветовал использовать 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