我们如何通过Jquery从MVC中的FormData映射c#复杂列表对象

我们如何通过Jquery从MVC中的FormData映射c#复杂列表对象,jquery,ajax,asp.net-mvc,multipartform-data,form-data,Jquery,Ajax,Asp.net Mvc,Multipartform Data,Form Data,我的控制器中有一个列表对象。我需要用数据映射这个列表对象,这些数据在来自FormData的Ajax调用中传递给控制器。我使用FormData的原因是,我需要在这个ajax调用中从视图中获取一些文件 请在下面找到我的代码 public class AdModel { public PartsAd PartsAdModel { get; set; } public List<HttpPostedFileBase> AdImages { get; set; } } pub

我的控制器中有一个列表对象。我需要用数据映射这个列表对象,这些数据在来自FormData的Ajax调用中传递给控制器。我使用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; }
}
下面是我的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时,它为null


有人能帮我吗?

要使模型绑定正常工作,表单数据的属性应使用此名称

PartsAdModel.VehicleList[{n}].VehicleBrand
其中,
{n}
是要发送的车辆项目数组的从零开始的索引

formd数据项名称中不需要
adModel
前缀,因为model binder将不关心您在HttpPost操作方法中使用的参数名称

下面的代码应该可以工作。我刚刚为
车辆列表
属性硬编码了2项。您可以更新它,以便它根据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');
});

非常感谢Shyju的快速回答。formdata中的adModel前缀导致了我的问题。当我把它取下来的时候,它工作的很好。
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');
});