2013-12-23 80 views
0

我正在用AJAX提交JQuery的一些數據(Collection<Cars>),但現在我不知道如何在我的Action輸入參數中定義對象。我已經嘗試將其定義爲FormCollection並且我收到了所有數據。不過我真正想要的是定義爲ICollection<Car>但是當我這樣做時我的對象變爲空。我怎樣才能做到這一點?或者我怎麼能解析一個FormCollectionICollection<Car>定義輸入參數的名稱

我的控制器:

public ActionResult UpdateTable(ICollection<Car> collection) 
{ 
//some code 
} 

我的JS:

function updateTable(tableId) { 
     if (tableId == "myTable") 
     { 
      event.preventDefault(); 

      if ($("#" + tableId + " tbody tr").length % 2 == 0) 

       var myTableData = $("#" + tableId).find("select, input").serializeObject(); 

      $.post("../../Car/UpdateTable/", myTableData , function(partial) { 
       $("#myOtherTable tbody").append(partial); 
      }); 
     } 
    } 

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

Car.cs:

public int Id { get; set; } 
public string Name { get; set; } 
public ICollection<Owner> Owners { get; set; } 
public bool IsSold { get; set; } 

個結果:

當輸入參數是ICollection<Car>什麼來動作控制器:

當輸入參數爲FormCollection(在AllKeys)什麼來動作控制器:

Car[0].Id 
Car[0].Name 
Car[0].Owners 
IsSold 

我查看(行表):

<tr> 
     <td> 
      @Html.TextBoxFor(model => model.Id, new { Name = modelFieldInitialName + "Id", id = modelFieldInitialId + "Id" }) 
      @Html.ValidationMessageFor(model => model.Id) 
     </td> 
     <td> 
      @Html.TextBoxFor(model => model.Name, new { Name = modelFieldInitialName + "Name", id = modelFieldInitialId + "Name" }) 
      @Html.ValidationMessageFor(model => model.Name) 
     </td> 
     <td> 
      @Html.DropDownListFor(model => model.Owners, new SelectList(TempData["OwnersList"] as IEnumerable, "Id", "Description"), "", new { Name = modelFieldInitialName + "Owners", id = modelFieldInitialId + "Owners" }) 
      @Html.ValidationMessageFor(model => model.Owners) 
     </td> 
     <td> 
      @Html.CheckBoxFor(model => model.IsSold, new { type = "checkbox", Name = modelFieldInitialName + "IsSold", id = modelFieldInitialId + "IsSold" }) 
      @Html.ValidationMessageFor(model => model.IsSold) 
     </td> 
    </tr> 
+0

你試圖發送一個JSON? –

+0

@Guillelon我該怎麼做?我從來沒有與JSON合作 – Ninita

+0

不能用你的HTML表格和我的汽車類定義 –

回答

0

好了,經過多次尋找,並嘗試我的代碼,我終於發現了問題:

如果我們發送的CarStand模型類型(例如),它包括一個ICollection<Car>的視圖中,類似這樣的地方的情況下,我們正在構建一個動態表(並定義元素名稱和id),以接收與FormCollection不同的東西,我們不能指望控制器接收到ICollection<Car>

模型傳遞給視圖(CarStand。CS):

public ICollection<Car> Cars{ get; set; } 
//other properties 

但我們可以發送/後到控制器的整個模型傳遞給視圖,但是我們需要選擇的數據。因此,它的工作是這樣的:

public ActionResult UpdateTable(CarStand collection) 
{ 
//some code 
} 

而且JQuery的可以留像以前一樣:

function updateTable(tableId) { 
     if (tableId == "myTable") 
     { 
      event.preventDefault(); 

      if ($("#" + tableId + " tbody tr").length % 2 == 0) 

       var myTableData = $("#" + tableId).find("select, input").serializeObject(); 

      $.post("../../Car/UpdateTable/", myTableData , function(partial) { 
       $("#myOtherTable tbody").append(partial); 
      }); 
     } 
    } 
0

我幾天前曾遇到類似的情況,我正在發佈我的解決方案。

我假設你的表看起來像這樣。

<table id="partTable"> 
<tr> 
    <td class="cell">Nitin</td> 
    <td class="desc">Varpe</td> 
    <td class="desc">8881</td> 
</tr> 
<tr> 
    <td class="cell">Parag</td> 
    <td class="desc">Lombar</td> 
    <td class="desc">4999</td> 
</tr> 

</table> 
<div> 
<input type="button" id="sendRequest" value="send" /> 
</div> 

<script type="text/javascript"> 

    $('#sendRequest').click(function (e) { 
     PostTable(); 
    }); 


    // Read a row 
    function GetRow(rowNum) { 
     var tableRow = $('#partTable tr').eq(rowNum); 

     var row = {}; 

     row.FirstName = tableRow.find('td:eq(0)').text(); 
     row.LastName = tableRow.find('td:eq(1)').text(); 
     row.RollNumber = tableRow.find('td:eq(2)').text(); 


     return row; 
    } 

    // Read all rows 
    function GetAllRows() { 
     var dataRows = []; 

     $('#partTable tr').each(function (index, value) { 
      var currentRow = GetRow(index); 
      dataRows.push(currentRow); 
     }); 

     return dataRows; 
    } 

    // POST rows to server 
    function PostTable() { 
     //var crossId = getParameterByName('id'); 
     var jsonRequest = { rows: GetAllRows()}; 

     $.ajax({ 
      type: 'POST', 
      url: "@(Url.Action("Action", "Controller"))", 
      data: JSON.stringify(jsonRequest), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      async: false, 
      success: function (data) { 
      //ur logic after success     
       return true; 
      }, 
      error:function (ts){ 
      alert(ts.responseText); 
       return false; 
       } 

       }); 
      } 

    </script> 

這是班級。

public class Row 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string RollNumber { get; set; } 

    } 

行動調用

public ActionResult GetRows(List<Row> rows) 
     { 
      //your logic 

      return Json(new 
      { 
       list = object 
      }); 

     } 

希望這有助於!

+0

所以基本上你發送一個'JSON.stringify(jsonRequest)'對象並且控制器識別出像'List '。但是對我來說,我的代碼仍然很奇怪,因爲'serializeObject()'或者'serialize()'與'JSON.stringify()'具有相同的行爲。此外,你的代碼似乎不是一個好的做法,因爲沒有活力。如果行表中有100個字段,則必須多次執行此操作,並且不能在表中加入或取得代碼,而不必在JScript中進行更改 – Ninita

+0

這就是我要求您顯示您的類的原因 –

+0

我用你問的代碼更新了我的問題 – Ninita

相關問題