Невозможно вернуть список из AJAX вызова MVC?После одного упомянутого примера - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь вернуть список из MVC controller.Значение возвращается легко, когда я возвращаю значение жесткого кода.Но когда я возвращаю список, это дает мне ошибку.Вот мой код,

Ajax-вызов,

function MyFunction() {
    alert($('#DDlSurvey').val());
    $.ajax({
        url: "@Url.Action("Index", "ConductSurvey")",
        data: { prefix: $('#DDlSurvey').val() },
        type: "POST",
        dataType: "json",
        success: function (data) {
             // loadData(data);
            alert("Success");
           // alert(data)
        },
        error: function (data){
            alert("Failed! Please try again.");
        }
    });
    //$('#YourLabelId').val('ReplaceWithThisValue');
}

и мой метод,

[HttpPost]
public JsonResult Index(int prefix)
{

    List<SelectList> Questions = new List<SelectList>();
    List<Question> QuestionList = new List<Question>();
    List<string> ll = new List<string>();
    Question nn = new Question();
    SurveyAppEntities ObjectSur = new SurveyAppEntities();

    QuestionList = (from q in ObjectSur.Questions
                    join b in ObjectSur.SurveyQuestions on q.ID equals b.QuestionID
                    where b.SurveyID.Equals(prefix)
                    select q).ToList();
   //return Json("OK");
  return new JsonResult  {Data=QuestionList, JsonRequestBehavior=JsonRequestBehavior.AllowGet};
}

Когда я возвращаю OK, я получаю его, но когда я пытаюсьвернуть QuestionList Он не возвращает данные и отображает сообщение Failed

Я также использую одну ссылку для справки, в которой каждая вещь такая же, как ссылка,

http://www.dotnetawesome.com/2014/05/how-to-retrieve-database-data-show-using-jquery-mvc-asp.html

Надежды на ваше предложение

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Обнаружена циклическая ссылка указывает, что EF генерирует прокси-объекты при генерации результатов запроса, которые нельзя сериализовать с использованием JsonResult.Предполагается, что SurveyAppEntities является вашим DbContext экземпляром, поэтому вам нужно сделать один из 2 вариантов ниже:

1) Отключить создание прокси

Необходимо установитьProxyCreationEnabled свойство false, которое не позволяет EF создавать прокси-объекты, которые нельзя сериализовать:

[HttpPost]
public JsonResult Index(int prefix)
{

    List<SelectList> Questions = new List<SelectList>();
    List<Question> QuestionList = new List<Question>();
    List<string> ll = new List<string>();
    Question nn = new Question();
    SurveyAppEntities ObjectSur = new SurveyAppEntities();

    // this line is mandatory
    ObjectSur.Configuration.ProxyCreationEnabled = false;

    QuestionList = (from q in ObjectSur.Questions
                    join b in ObjectSur.SurveyQuestions on q.ID equals b.QuestionID
                    where b.SurveyID.Equals(prefix)
                    select q).ToList();

    return Json(QuestionList, JsonRequestBehavior.AllowGet);
}

2) Отключить отслеживание результатов запроса

EF реализует отслеживание результатов запроса с помощью прокси-объектов, которые можно отключить, добавив AsNoTracking() к каждой сущности таблицы:

[HttpPost]
public JsonResult Index(int prefix)
{

    List<SelectList> Questions = new List<SelectList>();
    List<Question> QuestionList = new List<Question>();
    List<string> ll = new List<string>();
    Question nn = new Question();
    SurveyAppEntities ObjectSur = new SurveyAppEntities();

    QuestionList = (from q in ObjectSur.Questions
                    join b in ObjectSur.SurveyQuestions on q.ID equals b.QuestionID
                    where b.SurveyID.Equals(prefix)
                    select q).AsNoTracking().ToList(); // prevents result tracking

    return Json(QuestionList, JsonRequestBehavior.AllowGet);
}

Примечание:

Вы также можете попытаться вернуть только обязательные свойства вместо всего объекта ObjectSur.Questions.

Проблема, связанная с:

Обнаружено исключение при циклической ссылке при сериализации объекта в JSON

0 голосов
/ 29 ноября 2018

Просто верните список, как показано ниже

return Json(QuestionList, JsonRequestBehavior.AllowGet);
...