2015-05-11 26 views
1

任何人都可以告訴我如何將所選相關隱藏字段值的列表傳遞給控制器​​。指定的字段返回值是布爾(真)。有超過100個列表項目。如果管理員選擇(分配)列表並提交,它會將所有列表值傳遞給控制器​​並更新數據庫。將所選相關隱藏字段值形式傳遞給控制器​​

這是我的看法頁面CHTML代碼:

@using (Html.BeginForm("CAssigned", "Orders", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @foreach (var item in Model) 
    { 
     @Html.HiddenFor(model => item.LocationId) 
     <td> 
      @Html.DisplayFor(modelItem => item.MapIcons) 
      @Html.HiddenFor(model => item.MapIcons,"MapIcons") 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.Assigned) 
      @Html.HiddenFor(model => item.Assigned) 
     </td> 
    } 
    <input type="Submit" value="Select" /> 
} 

我控制器

[HttpGet] 
    public ActionResult CAssigned() 
    { 
     var orders = db.Locations.ToList(); 
     return View(orders); 
    } 

    [HttpPost] 
    public ActionResult CAssigned(IEnumerable<Location>) 
    { 
    return View(); 
    } 

HTML視圖源

<input data-val="true" data-val-number="The field LocationId must be a number." data-val-required="The LocationId field is required." id="item_LocationId" name="item.LocationId" type="hidden" value="1" /> 
<td> 
    red-dot.png 
    <input Length="8" id="item_MapIcons" name="item.MapIcons" type="hidden" value="red-dot.png" /></td> 
<td> 
<input class="check-box" data-val="true" data-val-required="The Assigned to Courier field is required." id="item_Assigned" name="item.Assigned" type="checkbox" value="true" /><input name="item.Assigned" type="hidden" value="false" /> 
<input type="Submit" value="Select" /> 
<input id="item_Assigned" name="item.Assigned" type="hidden" value="False" /> 
<td> 
+0

您不能使用foreach循環綁定到集合(您正在生成與您的模型(無索引器)無關的重複'id'屬性(無效html)和'name'屬性。您需要爲模型使用'for'循環或自定義'EditorTemplate'。無論如何,您爲什麼要爲屬性'Assigned'隱藏輸入,因爲您有一個n'EditorFor()'爲同一個屬性。你的POST方法參數需要是你的模型('public ActionResult CAssigned(IEnumerable )',因爲這就是你的觀點所基於的。 –

+0

謝謝你的回放。@for(var i = 1; i Rob

+0

您的模型需要實現'IList'然後'for(int i = 0; i m [i] .LocationId ....}'這將產生'',''等。另請參考[this answer] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)更多詳細信息 –

回答

1

您使用foreach循環不會產生正確的名稱綁定到集合所需的屬性,並且您需要使用for循環或用於typeof Location的自定義EditorTemplate,以便表單控件包含索引器。請參閱this answer以獲取有關如何命名集合的表單控件以及如何使用EditorTemplate的更多詳細信息。

要使用for循環,您查看的需求是

@model IList<yourAssembly.Location> 
@using (Html.BeginForm()) // no need to add the parameters since you posting to the same method 
{ 
    <table> 
    for(int i = 0; i < Model.Count; i++) 
    { 
     <tr> 
     <td> 
      @Html.HiddenFor(m => m[i].LocationId) 
      @Html.HiddenFor(m => m[i].MapIcons) 
      @Html.DisplayFor(m => m[i].MapIcons) 
     </td> 
     <td> 
      @Html.CheckBoxFor(m => m[i].Assigned) 
     </td> 
     </tr> 
    } 
    </table> 
    <input type="Submit" value="Select" /> 
} 

並在發佈方法簽名必須是(爲參數添加一個名字)

[HttpPost] 
public ActionResult CAssigned(IEnumerable<Location> model) 

旁註:

  1. 刪除Assigned屬性的隱藏輸入。你已經 已經產生了 屬性的複選框(以及相關的隱藏輸入),所以它也只是忽略回傳反正
  2. <input>不是<tr>元素的有效孩子,所以一定要確保 你包括他們內部的<td>元素
+0

感謝您的代碼,我有一個問題[HttpPost] public ActionResult CAssigned(IEnumerable ){return View() }。爲什麼會出現錯誤「Error Identifier expected」?我必須改變我的控制器? – Rob

+0

我有正確的用法更新問題 - 像任何方法,你需要定義參數的類型和名稱 - 在你的情況下,你只包括類型 - IEnumerable ' - 但省略了參數的名稱 –

+0

這個控制器[HttpPost] public ActionResult CAssigned(Location location) { \t \t return View(); \t { – Rob

相關問題