2015-05-11 24 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

相关问题