2017-02-14 1 views
-1

У меня есть действие контроллера MVC с параметром inputModel, у которого есть свойство типа списка, и I, m, используя $('form').serialize() для сериализации содержимого формы и добавления некоторых моих пользовательских данных в сериализованную строку, но внутри объекта модели ввода метода действия свойство list пусто, Может ли один помочь мне, ниже примеры кодаКак сопоставить Mvc Просмотр данных модели и ajax, имеющих свойство списка?

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

[HttpPost] 
public ActionResult Edit(ALDS.Web.Areas.Direct2M3.Models.ItemInputModel collection) 
{ } 

ItemInputModel класс

public class ItemInputModel 
    { 
     //......Some property here.. 
     public List<FabricCompositionInputModel> FabricCompositions { get; set; } 
    } 

FabricCompositionInputModel класса

public class FabricCompositionInputModel 
    { 
     public int ItemID { get; set; } 
     public string CompositionCode { get; set; } 
     public decimal Value { get; set; } 

    } 

Ajax вызов

function save() { 

    var compositionData = generateCompositionForSave(); //Returns array 
    var data = $('form').serialize(); 
    var d2 = JSON.stringify(compositionData); 

    var data2 = data + '&FabricCompositions=' + d2; 

    $.ajax({ 
     type: 'POST', 
     dataType: 'json' , 
     cache: false, 
     url: '/ItemMaster/Edit', 
     data: data2, 
     success: function (data, textStatus, jqXHR) { 
      sucess(data); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      failed(jqXHR); 
     } 

    }); 

} 

Массив производящей функции

function generateCompositionForSave() { 
    var arr = []; 
    var delClassList = $('#compositionContainer').find('.btnRemoveCompositions'); 
    for (var c = 0; c < delClassList.length; c++) { 
     var row = $(delClassList[c]).closest('.row'); 
     var code = row.find('.compositionCode').val(); 
     var value = parseInt(row.find('.compositionValue').val()); 
     arr.push({ItemID:0, CompositionCode:code, Value:value}); 
    } 

    return arr; 
} 
+0

Вы не можете комбинировать данные из '.serialize();' и такого массива. Если вы создали, вы в первую очередь формируете элементы управления из элементов коллекции, '.serialize()' - это все, что требуется. Показывать часть представления, которая генерирует эти элементы управления формы. –

ответ

1

Вы не строите данные правильно, и это должно быть

var compositionData = generateCompositionForSave(); 
var data = $('form').serializeObject(); // see function below 
data['FabricCompositions'] = compositionData; // add the array to the serialized data 
var data2 = JSON.stringify({ collection: data }), // stringify it 

$.ajax({ 
    type: 'POST', 
    contentType: "application/json; charset=utf-8", // add contentType 
    dataType: 'json' , 
    cache: false, 
    url: '@Url.Action("Edit", "ItemMaster")', // don't hard code your url's 
    data: data2, 
    success: function (data, textStatus, jqXHR) { 
     .... 

И добавьте следующую функцию (предупреждение: это не будет работать правильно для <select multiple> элемента)

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

Обратите внимание, что если вы создаете ваши элементы формы правильно используя for петли или обычай EditorTemplate для TypeOf FabricCompositionInputModel (см Post an HTML Table to ADO.NET DataTable), например,

for(int i = 0; i < Model.FabricCompositions.Count; i++) 
{ 
    @Html.TextBoxFor(m => m.FabricCompositions[i].CompositionCode) 
    @Html.TextBoxFor(m => m.FabricCompositions[i].Value) 
} 

, то все, что требуется

var data = $('form').serialize(); 
$.ajax({ 
    type: 'POST', 
    dataType: 'json' , 
    cache: false, 
    url: '@Url.Action("Edit", "ItemMaster")', 
    data: data, 
    success: function (data, textStatus, jqXHR) { 
+0

теперь список равен нулю, внутри метода действия, – Roshan

+0

Не, если вы выполнили код в первом фрагменте –

+0

И вывод 'console.log (data2);' будет что-то вроде '{" collection ": {" ID ": 1 .....", "FabricCompositions": [{"ItemID": 0, "CompositionCode": "xxx", "Value": "yyy"}, {....}]}} ' –

Смежные вопросы