Не могу передать массив из Ajax в контролер mvc.

516
24 ноября 2016, 09:57
var formData = $(self.parentRow).find('form').serializeArray();    
var calendarAttachment = [];
        calendarAttachment[0] = { PKID: 10 };
        calendarAttachment[1] = { PKID: 23 };
        calendarAttachment[2] = { PKID: 199 };
        formData.push({ name: 'CalendarAttachments', value: calendarAttachment });
$.post('/Calendar/Save', formData, function (json) {...}

Имеется следующий код в js. При передаче данных в контроллер не хочет получать значения. Причем не хочет получать именно значения этого массива. При передаче других данных все норм.

public List<EventFileItem> CalendarAttachments { get; set; }

Сверху свойство которое содержит модель.

public class EventFileItem
{
    public long PKID { get; set; }
    public string Description { get; set; }
    public long? CalendarId { get; set; }
    public string FilePath { get; set; }
}

Пробовал делать поле PKID и как стринг, но ничего не помогло. ХЕЛП!

Answer 1

Проблема в том, что функция serializeArray сериализует внутренние массивы не в формате данных формы. Данные отправляются в виде:

А должны приходить в следующем виде:

Для этого данные формы нужно сериализовать в js-объект. Здеь либо добавить свою функцию:

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

И дальше использовать ее

var formData = $(self.parentRow).find('form').serializeArray();    
var calendarAttachment = [];
        calendarAttachment[0] = { PKID: 10 };
        calendarAttachment[1] = { PKID: 23 };
        calendarAttachment[2] = { PKID: 199 };
        formData['CalendarAttachments'] = calendarAttachment;
$.post('/Calendar/Save', formData, function (json) {...});

Либо просто использовать reduce для массива, при отправке данных:

$.post('/Calendar/Save', formData.reduce(function(previousValue, currentValue) { previousValue[currentValue.name] = currentValue.value; return previousValue; }, {}), function (json) {...})
READ ALSO
Как дождаться выполнения функции?

Как дождаться выполнения функции?

После java асинхронность в js это беда для меня. Суть проблемы: написать функцию, которая проверяет наличие файла, если есть, то true, нет - false.

471
как json вывести строку J в html

как json вывести строку J в html

как в json вывести строку J в html.

536
Jquery ui resizable

Jquery ui resizable

Возможно ли поменять свойства блока в jquery-ui. css.

379
Как подключить jquery вместе с React js?

Как подключить jquery вместе с React js?

Установил я через npm jquery.

1935