2017-12-25 16 views
3

コントローラにリストオブジェクトがあります。このListオブジェクトを、FormDataからのAjax呼び出しでコントローラに渡されるデータでマップする必要があります。私がFormDataを使用している理由は、私はこの同じajax呼び出しでビューからいくつかのファイルを取得する必要があります。どうすればMVCのFormDataからC#複合リストオブジェクトをJqueryを介してマップできますか

私が見たときに以下

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の場合はnull

誰か助けてくれますか?仕事への結合モデルの場合

答えて

0

、フォームのデータは、この名前{n}を送信したい車両項目の配列の0から始まるインデックスです

PartsAdModel.VehicleList[{n}].VehicleBrand 

との特性を有するべきです。

モデルバインダーは、HttpPostアクションメソッドで使用するパラメーター名を気にしないので、formdデータ項目名にadModelという接頭語は必要ありません。

以下のコードが有効です。私はちょうどVehicleListプロパティの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'); 
}); 
+0

このクイックアンサーでは多くのShyjuさんに感謝します。フォームデータのadModel接頭辞が問題を引き起こしていました。そのうまくいって、私はそれを取り除いた。 – Lijo

関連する問題