Вопрос по jquery, asp.net-mvc-3, ajax – MVC 3 AJAX Post, список заполнен объектами, но свойства объектов пусты

8

У меня есть следующая проблема:

При нажатии кнопки я отправляю некоторые данные на сервер. Мой контроллер Action выглядит так:

<code>public ActionResult Accept(List<MyViewModel> entries)
{
    //here entries HAS 2 MyViewModel-Instances in it.
    //The entries are not null, but the values of the instances are!
    //entries[0].ParamA is null
}
</code>

Где MyViewModel выглядит так:

<code>public class MyViewModel
{
    public string ParamA { get; set; }
    public string ParamB { get; set; }
}
</code>

А AJAX-Call - это следующее:

<code>var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, { ParamA: "C", ParamB: "D" }] };

$.ajax({
    type: 'POST',
    url: url,
    cache: false,
    data: myEntries,
    dataType: 'text' });
</code>

What i already tried to do:

Changed dataType to 'json' used: traditional: true tried var myEntries = JSON.stringify(...); tried var myEntries = { entries : [JSON.stringify({ ... }), JSON.stringify({ ... })] }; same as above, but with jQuery.param(..., true); Use of IEnumerable or MyViewModel[] instead of list. ANY combination of the above

Что я здесь не так делаю?

Большое спасибо заранее за помощь!

EDIT

Мой (Razor) View не интересен в данный момент, так как он не имеет ничего общего с чем-либо. Я НЕ использую какие-либо методы HTML.TextBoxFor (или аналогичные) для заполнения myEntries-Variable. Он на самом деле заполнен динамически (потому что есть много много условий). Ради вопроса (и моего собственного тестирования) я жестко закодировал переменную. :)

У меня есть ответ! Я отправлю как можно скорее (придется подождать 8 часов ...) Shion
Какой ответ? : -) Andrew
@ AndrewF: см. Мой ответ ниже. (Я могу отметить это как принятый завтра;)) Shion
Можете ли вы опубликовать код вашего (Razor) зрения? Andrew
@My View нет ничего интересного. Я уточнил это в своем вопросе. Смотрите раздел EDIT Shion

Ваш Ответ

3   ответа
12

С твоим ответом и использованиемJSON.stringify метод у меня работает

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, 
                            { ParamA: "C", ParamB: "D" }] };

$.ajax({
        type: 'POST',
        url: '/{controller}/{action}',
        cache: false,
        data: JSON.stringify(myEntries),
        dataType: 'json', 
        contentType: 'application/json; charset=utf-8'
    });
Кажется, я забыл сказать, что я тоже использовал JSON.stringify. Спасибо что подметил это Shion
Спасибо, у меня была та же проблема с заполнением моего списка, но все их свойства были пусты. Я использовал $ .Post (..), который, как я думал, будет просто оберткой вокруг $ .ajax (тип: 'POST', ...), но должна быть некоторая разница, так как использование приведенного выше примера $ .ajax прекрасно работает. . Alex Marshall
Я просто хочу подчеркнуть, что настройка contentType на 'application / json' является критической. В моем случае это просто не работало без этого! Valeriy Lyuchyn
5

jQuery иногда может сбивать с толку.

dataType - это параметр, который указывает, что вы хотите получить НАЗАД с сервера. contentType - это параметр, который указывает, что вы ОТПРАВЛЯЕТЕ на сервер.

Так что из приведенного выше примера это работает, если вы добавите:

contentType: 'application / json; кодировка = UTF-8' ,

в AJAX-вызове.

1

как создать список, который будет публиковаться на контроллере. Это потому, что вам не нужно оборачивать массив именем списка. Это выглядит некрасиво и не поддается управлению с помощью встроенных функций. Этот пример здесь, чтобы показать, как отправить обратно JSON, который MVC будет понимать и интерпретировать как список. (Но даже если Array обернут, он все равно работает, но это статический контент, которым трудно управлять)

В этом примере использовался сортируемый плагин jQuery. Я хочу опубликовать всю модель списка с новыми индексами упорядочения для сохранения в базе данных.

update: function (event, ui) {

 img = { key: 0, order: 0, url: '' }; //Single image model on server
 imgs = new Array(); //An array to hold the image models.

 //Iterate through all the List Items and build my model based on the data.
 $('#UploaderThumbnails li').each(function (e) {
      img.key = $(this).data('key');  //Primary Key
      img.order = $(this).index();  //Order index
      imgs.push(img); //put into "list" array
 });

 //And what is in the answer - this works really great
 $.ajax({
     url: '/Image/UpdateOrder',
     data: JSON.stringify(imgs),
     type: 'POST',
     contentType: 'application/json; charset=utf-8'
  });

}

А мой контроллер MVC так же прост, как ...

  [HttpPost]
  public ActionResult UpdateOrder(List<Models.Image> images)
  {
     //Images at this point is a proper C# List of Images! :) Easy!

      return Content("");
  }
Это сработало для меня. И еще раз, не забывайте, что тип контента application / json! K0D4

Похожие вопросы