Перенос объектов JSON в View в MVC 3 - PullRequest
1 голос
/ 21 июня 2011

У меня такая проблема.Я хочу вернуть объект JSON из контроллера для просмотра после AJAX-запроса.Код JS:

        $.ajax(
         {
                url : '/Order/GetArticleForBasicPosition',
                data : article,
                type : 'POST',

                success : function (data) 
                {
                    alert("yyyyyyy");    
                },
                 error:function (xhr, ajaxOptions, thrownError)
                 {                   
                        alert(xhr.status); 
                        alert(thrownError);
                 }  
         });

И контроллер:

   [HttpPost]
    public JsonResult GetArticleForBasicPosition(string article)
    {
        Article articleInfo = _service.GetArticleForBasicPosition(article);

        return Json(articleInfo);
    }

И я получаю 500 Внутренняя ошибка сервера.Я отлаживал контроллер и вижу, что он получает правильный параметр «article», а сервисный метод возвращает правильный объект.Я попробовал оба типа запросов GET и POST.

На самом деле, когда я изменил свой контроллер следующим образом:

  [HttpPost]
    public JsonResult GetArticleForBasicPosition(string article)
    {
        var articleInfo = new Article() {GoodsName = "ffff", GoodsPrice = 1234, CatalogueName = "uuuuuuui"};

        return Json(articleInfo);
    }

все прошло нормально.

Я предполагаю, что причина мояразмер объекта (я использую EntityFramework, а articleInfo имеет много навигационных свойств), но не нашел никого, кто писал бы об этой же проблеме.

Кто-нибудь знает, что является причиной такой проблемы и является ли ее размеробъекта, какова лучшая практика для ее решения?

Спасибо.

1 Ответ

3 голосов
/ 21 июня 2011

Я полагаю, что причиной является размер моего объекта (я использую EntityFramework, а articleInfo имеет много навигационных свойств), но не нашел никого, кто писал бы об этой же проблеме.

Айенде написал написал это . Многие моих ответов на этом сайте в теге asp.net-mvc примерно равны it .

it называется видом модели. Вы никогда не должны передавать какие-либо доменные объекты в ваши представления. Вам следует разрабатывать модели представлений, специально разработанные для нужд представления и содержащие только необходимые свойства.

Полагаю, проблема в том, что либо ваши доменные модели содержат некоторую рекурсивную структуру, которая, очевидно, не может быть сериализована в JSON, либо в момент выполнения результата сериализатор пытается коснуться модели вы прошли, ваш контекст данных давно исчез и уничтожен.

Итак, попробуйте это:

[HttpPost]
public JsonResult GetArticleForBasicPosition(string article)
{
    Article articleInfo = _service.GetArticleForBasicPosition(article);
    return Json(new
    {
        Property1NeededByTheView = x.Foo,
        Property2NeededByTheView = x.Bar.Baz
    });
}

Также убедитесь, что _service.GetArticleForBasicPosition не выдает исключение, иначе вы можете получить ошибку 500.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...