Параметр data null ajax для контроллера mvc

Первоначально я передавал один параметр своему контроллеру MVC через Ajax, и он работал правильно. Данные параметров были получены без проблем. Однако теперь мне нужно передать дополнительный параметр, и когда я это сделаю, ни один из параметров не отправляет данные в контроллер? Спасибо!

Код Ajax:

        function uploadFile() {
        var fileData = new FormData($(form1)[0]); //THIS IS A FILE UPLOAD
        var details = JSON.stringify(markers); //MARKERS IS AN ARRAY

        $.ajax({
            url: '../Home/FilePost',
            type: 'Post',
            success: function (result) {
                var newWindow = window.open('LasView?fileName=' + result, "", "new window");

            },
            error: function (xhr, status, error) {
                alert(xhr.responseText);
            },
            xhr: function () {  // Custom XMLHttpRequest
                var myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload) { // Check if upload property exists
                    // TODO...
                }
                return myXhr;
            },
            error: function () { },
            data: { filePost: fileData, googleMarkers: details },
            cache: false,
            contentType: false,
            processData: false
        });
    }

Мой контроллер:

[HttpPost]
public string LasPost(HttpPostedFileBase filePost, string googleMarkers){
return something;
}

Мой массив:

 var markerObject = {
     lat: marker.position.lat(),
     lng: marker.position.lng()
    };
     markers.push(markerObject);

Вы не можете смешивать FormData и объекты - вам нужно добавить дополнительные данные в FormData

user3559349 11.04.2018 13:06

Но нет смысла делать googleMarkers строкой, если это массив - что это за массив?

user3559349 11.04.2018 13:07

Это массив объектов, поэтому я просто структурирую его. Что не так? Это проблема?

JohnTheWizard 11.04.2018 13:09

Зачем вам преобразовывать его в строку, а затем снова преобразовывать в контроллере? Покажите, что это (всего 1 или 2 элемента), чтобы можно было добавить ответ)

user3559349 11.04.2018 13:11

Почему, а как иначе? Я добавил свой объектный код.

JohnTheWizard 11.04.2018 13:17

Это всего лишь один объект или их может быть много объектов в массиве?

user3559349 11.04.2018 13:19

В массиве может быть много объектов ..... [объект объект, объект объект, объект объект]

JohnTheWizard 11.04.2018 13:20

Позвольте нам продолжить обсуждение в чате.

user3559349 11.04.2018 13:20
0
8
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете смешивать FormData и предметы. Вы должны .append() каждую пару имя / значение для экземпляра FormData.

Поскольку вы структурировали свой массив и привязываетесь к параметру string googleMarkers, ваш код должен быть

function uploadFile() {
    var fileData = new FormData($(form1)[0]); //THIS IS A FILE UPLOAD
    var details = JSON.stringify(markers); //MARKERS IS AN ARRAY

    fileData.append('googleMarkers', details); // append the name/value pair
    $.ajax({
        ....
        data: fileData, // send only the FormData instance
        ....
    });
})

Однако вы должны воспользоваться преимуществами функций привязки модели MVC и публикации данных, которые привязываются к модели, представляющей ваши координаты, например

public class Coordinate
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

и тогда метод POST будет

[HttpPost]
public string LasPost(HttpPostedFileBase filePost, IEnumerable<Coordinate> googleMarkers)

и отправить эти данные

var fileData = new FormData($(form1)[0]);
for(var i = 0; i < markers.length; i++)
{
    fileData.append('[' + i + '].Latitude', markers[i].lat);
    fileData.append('[' + i + '].Longitude', markers[i].lng);   
}
$.ajax({
    ....
    data: fileData,
    ....
});

Другие вопросы по теме