Передача списка JSON в MVC 3 - PullRequest
5 голосов
/ 20 июня 2011

Я пытаюсь отправить это с Ajax на контроллер MVC3:

    var params = {
        'productId': productId,
        'list': []
    };

    $.each($('.specificationId'), function () {
        var specId = $(this).attr('id').replace('specification_', '');

        var specification = {
            specificationId: specId,
            articleId: $('#articleid_' + specId).attr('value'),
            price: $('#price_' + specId).attr('value'),
            stock: $('#stock_' + specId).attr('value'),
            stockCount: $('#stockcount_' + specId).attr('value'),
            weight: $('#weight_' + specId).attr('value'),
            visible: $('#visible_' + specId).attr('checked')
        };

        params.list.add(specification);
    });

    console.log(params);
    //all values are parsed fine here, shows an array with json objects

    $.ajax({
        type: "POST",
        url: "/Admin/Product/Save/",
        data: params,
        success: function () { alert('done'); }
    });

Теперь это должно перейти к контроллеру так:

    [HttpPost]
    public Boolean Save(Int32 productId, Object[] specifications)
    {

        return true;
    }

Но Object [] делаетне работает, возвращает ноль, я перепробовал все виды вещей, такие как списки моделей и т. д., но он останется нулевым.

Как решить эту проблему?

Ответы [ 3 ]

6 голосов
/ 20 июня 2011

Попробуйте изменить действие вашего контроллера на (я предполагаю, что спецификация - это модель, представляющая JSON, который вы пытаетесь опубликовать):

public Boolean Save(Int32 productId, List<Specification> specifications)

А затем измените эти вещи в своем JS:

var params = {
    'productId': productId,
    'specifications': []
};

params.specifications.add(specification);

$.ajax({
    type: "POST",
    url: "/Admin/Product/Save/",
    data: JSON.stringify(params),
    contentType: 'application/json',
    success: function () { alert('done'); }
});
6 голосов
/ 20 июня 2011

ASP.NET MVC 3 включает встроенную привязку модели JSON.

Создайте простые POCO, которые соответствуют JSON, который вы пытаетесь отправить:

public class ProductJsonModel
{
   public int ProductId { get; set; }
   public ProductSpecificationJsonModel[] @List { get; set; }
}

public class ProductSpecificationJsonModel
{
   public int SpecificationId { get; set; }
   public int ArticleId { get; set; }
   public double Price { get; set; }
   public int Stock { get; set; }
   public int StockCount { get; set; }
   public int Weight { get; set; }
   public bool Visible { get; set; }
}

Тогда примите это в вашем действии:

[HttpPost]
public Boolean Save(ProductJsonModel model)

Пока имена свойств в объекте JSON совпадают с именами свойств в POCO, MVC будет связываться для вас.

Также - вы должны сериализовать JSON, используя .stringify или что-то подобное, и соответственно установить contentType объекта $.ajax.

2 голосов
/ 20 июня 2011

jQuery .ajax() преобразует объект JSON в набор пар ключ-значение в типе содержимого application/x-www-form-urlencoded. Вы можете прочитать хорошее объяснение этого в сообщении в блоге и комментариях РАЗМЕЩЕНИЕ ДАННЫХ JSON НА MVC Controllers

Итак, вы должны либо создать пользовательский ModelBinder, либо поставить FormCollection form в качестве параметра вместо Object[]. FormCollection даст вам NameValueCollection значений формы, которые также реализуют IValueProvider. Вы можете просмотреть коллекцию, и все ваши данные будут там.

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