MVC2 отправляет коллекции из представления в контроллер через json - PullRequest
0 голосов
/ 12 августа 2010

Я просматриваю форумы уже 2 дня и не могу найти хороший ответ, поэтому просто опубликую его.

У меня возникла проблема при отправке JSON на контроллер вспасти.JSON должен отображаться в представление модели, но он продолжает получать значения по умолчанию (конструктор), а не значения из POST.

У нас есть серия JS-виджетов, которые содержат поле данных с json.Мы выполняем все наши манипуляции с данными в этих объектах виджетов на стороне клиента.Когда пользователь хочет сохранить, мы берем нужные нам данные из задействованных виджетов и помещаем их в другой объект JSON, который соответствует ViewModel и POST, который возвращается на сервер.

Например:

 $("#Save").click(function () {
        if (itemDetails.preparedForSubmit() && itemConnections.preparedForSubmit()) {
            itemComposite.data.Details = itemDetails.data;
            itemComposite.data.Connections= itemConnections.data;
            $.post(MYURL, itemComposite.data);
        } else {
            alert("failed to save");
        }
    });

Простой метод prepareForSubmit () выполняет такие вещи, как проверки или валидация в последнюю минуту, которые могут потребоваться для клиентской стороны.

Данные виджетов itemDetails соответствуют ViewModel.

ItemConnectionsДанные виджетов соответствуют коллекции ViewModels.

Контроллер выглядит следующим образом:

    [HttpPost]
    virtual public JsonResult SaveItemDetailsComposite(ItemComposite inItemData)
    {
        if (ModelState.IsValid)
        {
            try
            {
               _Mapper.Save(itemComposite.Details , itemComposite.Connections);
               return Json(true);                   
            }
            catch (Exception ex)
            {
                _log.Error("Exception " + ex.InnerException.Message);
                throw;
            }
        }

        return Json(SiteMasterUtilities.CreateValidationErrorResponse(ModelState));
    }

Класс ItemComposite представляет собой простую модель представления, которая содержит один объект itemDetails и коллекцию itemConnections.Когда он возвращает данные сюда, он просто получает данные по умолчанию, как если бы он получил новый ItemComposite, а не преобразовывает данные POST.

в Firebug, я вижу, что данные опубликованы.Хотя это выглядит странно, но не автоматически форматируется в firebug.

Ответы [ 4 ]

1 голос
/ 12 августа 2010

Вы говорите, что itemComposite.data отформатирован как объект JSON?Если это так, я уверен, что вам придется десериализовать его, прежде чем вы сможете привести его к своему объекту.Что-то вроде:

ItemComposite ic = jsSerializer.Deserialize<ItemComposite>(this.HttpContext.Request.Params[0]);
0 голосов
/ 13 августа 2010

Спасибо всем.Я думаю, что я решил свою проблему, и я почти уверен, что у меня было четыре проблемы.По большей части я следовал предложению Стивегиса и читал больше об этой статье: http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

Использование метода jQuery post () и определение json в качестве типа, похоже, на самом деле не отправляет его как json.Используя метод ajax () и указав json, он отправил его как json.

Метод JSON.serialize () также был необходим для чистой отправки через json.

Кроме того, моя конструкция ViewModel была большой проблемой.Мы используем аналитическую сборку кода MS, и он не хотел, чтобы у меня был установщик для моих коллекций во ViewModel.Так что я из мира java / hibernate, подумал, что им не нужно связываться, и он просто волшебным образом войдет в сериализованный объект.Однажды я просто подавил ошибку и перезагрузил мои сеттеры.Теперь я получаю коллекции в моем контроллере.

Я считаю, что использование провайдеров значений MVC2 Future делает что-то, но оно все еще не конвертирует даты json надежно, поэтому я все еще изучаю лучший способ сделать это.

Я надеюсь, что мои проблемы помогут другим.

ОБНОВЛЕНИЕ: использование этого метода для обновления наборов данных кажется очень медленным.Сбор с 200 записями в нем и 8 полями на запись занимает 3 минуты, чтобы добраться до контроллера.Всего 1 или 2 записи занимают очень мало времени.Единственное, что я знаю об этом, происходит здесь - это привязка данных к представлению модели.Я не знаю, предоставляет ли MVC2 простой способ отправки такого большого количества данных и их связывания.

0 голосов
/ 12 августа 2010

Вы также можете использовать JSON Serializer в WCF: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

ТАК не позволил бы мне поместить обе ссылки в один ответ, извините за разделенный ответ.

0 голосов
/ 12 августа 2010

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

JSON.NET кажется одной из основных потоковых сред: http://json.codeplex.com/releases/view/43775

Надеюсь, это поможет.

Кори

...