2010-08-11 3 views
0

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

У меня возникла проблема с отправкой 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"); 
     } 
    }); 

Метод preparedForSubmit() просто делает такие вещи, как любые проверки правильности или последней минуты форматирования может понадобиться сделать на стороне клиента.

ЭлементДетали данных виджетов соответствуют 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.

ответ

0

Спасибо всем. Я думаю, что решил свою проблему, и я уверен, что у меня было четыре вопроса. По большей части я следовал предложению этого предложения и читал об этой статье: 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 Будущие провайдеры Value делают что-то, но он по-прежнему не преобразовывает даты json надежно, поэтому я все еще исследую лучший способ сделать это.

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

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

0

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

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

Надеется, что это помогает.

Cory

+0

Спасибо, что я .Net noob пришел из GWT env, я прочитаю об этом, посмотрим, как это работает. –

1

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

ItemComposite ic = jsSerializer.Deserialize<ItemComposite>(this.HttpContext.Request.Params[0]); 
+0

Я просто попробовал это. это, похоже, дает мне тот же результат, что и inItemData. Params [0] выглядит так, как показывает мой firebug, и ic выглядит так же, как inItemData. Я уверен, что это имеет какое-то отношение к тому, как я делаю свой запрос или как работает привязка данных. Params [0] выглядит как {% 7b% 22TaskDetails% 22% 3a% 7b% 7d% 2c% 22LaborTypes% 22% 3a% 5b% 7b% 22LaborTypeID% 22% 3a93% 2c% 22LaborTypeID% 22% 3a1 ... –

+0

Вы видите, что в сети -> часть ответа от firebug? Если это так, оно закодировано неправильно. Он должен выглядеть как объект json, а не пучок кодировки url. Поскольку вы хотите отправить прямо в аргумент метода действия, взгляните на этот пост от Haack и посмотрите, помогает ли он: http://haacked.com/archive/2010/04/15/sending-json-to-an- жерех-нетто-MVC-действие-метод-argument.aspx – ThatSteveGuy

Смежные вопросы