Как мы можем сопоставить объект сложного списка С# из FormData в MVC через Jquery

У меня есть объект списка в моем контроллере. Мне нужно сопоставить этот объект списка с данными, которые передаются контроллеру в вызове Ajax из FormData. Причина, по которой я использую FormData, заключается в том, что мне нужно получить некоторые файлы из представления в этом же вызове ajax.

Пожалуйста, найдите мой код ниже

 public class AdModel
{
    public PartsAd PartsAdModel { get; set; }
    public List<HttpPostedFileBase> AdImages { get; set; }
}
public class PartsAd
{
    public List<Vehicle> VehicleList { get; set; }
}
public class Vehicle
{
    public string VehicleBrand { get; set; }
}

Ниже мой метод действий в контроллере

 public ActionResult AjaxPostAd(AdModel adModel)
    {
    }

Ниже мой код Jquery

var applicableVehicleBrands = $('#multiSelectApplicableVehicleBrand option:selected');
    var selectedBrand = 0;
    $(applicableVehicleBrands).each(function () {
        data.append("adModel[PartsAdModel.VehicleList[" + selectedBrand + "].VehicleBrand]", $(this).val())
        selectedBrand = selectedBrand + 1;
    });
 $.ajax({
    cache: false,
    type: "post",
    async: true,
    url: "" + ajaxPostURL + "",
    data: data,
    contentType: false,
    processData: false,
    success: function (data) {});

Но в моем контроллере, когда я ищу adModel.PartsAdModel.VehicleList, он равен нулю

Может кто-нибудь, пожалуйста, помогите мне?


person Lijo    schedule 25.12.2017    source источник


Ответы (1)


Чтобы привязка модели работала, данные формы должны иметь свойства с этим именем.

PartsAdModel.VehicleList[{n}].VehicleBrand

Где {n} — это нулевой индекс массива элементов транспортных средств, которые вы хотите отправить.

Вам не нужен префикс adModel в имени элемента данных формы, поскольку связыватель модели не будет заботиться об имени параметра, который вы используете в своем методе действия HttpPost.

Приведенный ниже код должен работать. Я просто жестко запрограммировал 2 элемента для свойства VehicleList. Вы можете обновить его, чтобы он динамически добавлял элемент (в цикле) на основе ваших входных данных DOM.

var data = new FormData();

data.append("PartsAdModel.VehicleList[0].VehicleBrand", "Honda");
data.append("PartsAdModel.VehicleList[1].VehicleBrand", "Toyota");

// Add the uploaded file
// Assuming you have a file input with name="AdImages"
$('input[name="AdImages"]').each(function(a, b) {
    var fileInput = $('input[name="AdImages"]')[a];
    if (fileInput.files.length > 0) {
        var file = fileInput.files[0];
        data.append("AdImages", file);
    }
});


$.ajax({
    type: "post",
    url: '@Url.Action("AjaxPostAd")',
    data: data,
    contentType: false,
    processData: false
}).done(function(r) {
    console.log('ajax call done');
});
person Shyju    schedule 25.12.2017
comment
Большое спасибо Shyju за этот быстрый ответ. Префикс adModel в данных формы вызывал у меня проблему. Он работает нормально, когда я его удалил. - person Lijo; 25.12.2017