2015-08-17 14 views
3

對於我們的網站,我們有一個管理部分和一個用戶部分。我們希望允許管理員指定向用戶部分中的用戶列出哪些訂單商品。嘗試將表格行作爲List <>對象返回到MVC控制器

我有一個MVC列表表,我已經啓用排序行以實際更改排序值。但我試圖將這種排序保存到數據庫中。正如你在下面看到的,我對某些屬性隱藏了元素,並且我的JavaScript正確設置了HiddenFor(item.SortOrder)。然後它調用控制器。但是我希望將整個行集合作爲列表傳遞迴列表對象。有什麼好的例子嗎?

@model System.Collections.Generic.IList<PublicationSystem.Model.CustomField> 
<table class="table sortable-table" 
data-source-href='@Url.RouteUrl("Default", 
    new { action = "_CustomFieldSort" }, 
    Request.Url.Scheme)'> 
    <thead> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(model => model[0].ColumnName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model[0].ColumnCaption) 
      </th> 
      <th></th> 
     </tr> 
    </thead> 

    @for (var i=0; i < Model.Count; i++) //each (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.HiddenFor(modelItem => Model[i].CustomFieldId,new {name="fieldsToEdit["+i+"].CustomFieldId"}) 
       @Html.HiddenFor(modelItem => Model[i].CustomFormId, new { name = "fieldsToEdit[" + i + "].CustomFormId" }) 
       @Html.HiddenFor(modelItem => Model[i].SortOrder, new { name = "fieldsToEdit[" + i + "].SortOrder", @class = "SortOrder" }) 
       @Html.DisplayFor(modelItem => Model[i].ColumnName) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => Model[i].ColumnCaption) 
      </td> 
      <td> 
       ... buttons 
      </td> 
     </tr> 
    } 
</table> 

我的javascript:

$(".sortable-table tbody").sortable({ 
    stop: function (event, ui) { 

     $(".sortable-table tr").each(function (index, element) { 
      var hiddenInput = $(element).find(".SortOrder").first(); 
      hiddenInput.val(index); 
     }); 
     $.ajax({ 
      url: $(".sortable-table").attr("data-source-href"), 
      method: "POST", 
      data: $(".sortable-table").serialize(), 
      success: function (result) { 
       ClearAndRefresh(); // Assumes parent has this function 
      } 
     }); 
    } 
}); 

我控制器的方法:

public ActionResult _CustomFieldSort(List<CustomField> fieldsToEdit) 
{ 
    if (fieldsToEdit != null) // fieldsToEdit is always null after the sort 
    { 
     var fieldCount = fieldsToEdit.Count(); 
    } 

    return null;// PartialView(); 
} 

我有我的JavaScript正確嘗試一個AJAX調用我的控制器的方法,但 'fieldsToEdit' 爲空。我究竟做錯了什麼?

+1

當你在客戶端排序時,你的隱藏字段會發生變化嗎?我現在只是不明白,爲什麼你把它放在表 –

+0

爲什麼你要在隱藏字段中保存排序值?在數據庫中保存新的排序值有什麼意義?用戶是否需要根據舊的排序來查看數據?通常我們將這些類型的數據綁定到一個網格,並在列中啓用排序,然後它將變得簡單 –

+0

是的,不,那不是我們想要的。管理員希望對這些字段進行排序,以便稍後用戶在頁面上查看它們時,它們將按順序顯示。這些字段不會按用戶的選擇進行排序,它們將按照管理員排序的特定順序進行排序。 –

回答

1

批量更新排序?使用for循環將使你整個列表映射回回後/獲取控制器

@model System.Collections.Generic.IList<PublicationSystem.Model.CustomField> 
<table class="table sortable-table"> 
<thead> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.ColumnName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.ColumnCaption) 
     </th> 
     <th></th> 
    </tr> 
</thead> 

@for (int i=0; i < Model.Length;i++) 
{ 
    <tr> 
     <td> 
      @Html.HiddenFor(modelItem => Model[i].CustomFieldId,new {name="fieldsToEdit["+i+"].CustomFieldId") 
      @Html.HiddenFor(modelItem =>Model[i].CustomFormId,new {name="fieldsToEdit["+i+"].CustomFormId") 
      @Html.HiddenFor(modelItem => Model[i].SortOrder, new { @class = "SortOrder",name="fieldsToEdit["+i+"].SortOrder" }) 
      @Html.DisplayFor(modelItem => Model[i].ColumnName,new {name="fieldsToEdit["+i+"].ColumnName") 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => Model[i].ColumnCaption,new {name="fieldsToEdit["+i+"].ColumnCaption") 
     </td> 
     <td> 
      ... buttons 
     </td> 
    </tr> 
} 

然後擊中按鈕回到方法發佈按鈕將批量更新整個列表,即時通訊不知道我是否正確回答你問題。

+0

你的意思是'點擊按鈕來發布按鈕'?控制器方法會是什麼樣子? –

+0

假設你有一個包含你的類的列表的模型;例如 'Model.ListOfClasses = new List ();' 然後countroller將 「[httpPost] 公衆的ActionResult YourMethod(名單 ListOfClasses) {// 處理你,在這裏 模型} 注意,默認的模型綁定器將期望查看有 @Html。 TexboxFor/HiddenFor,等(ListOfClasses [Index] .yourProperty) 當您發佈數據時,您的類列表將被映射回 – mahlatse

+0

好吧,我想通過javascript ajax調用回傳。 –

相關問題