将所选相关隐藏字段值表单的列表传递给控制器

时间:2015-05-11 00:46:16

标签: c# asp.net-mvc asp.net-mvc-4

有人可以告诉我如何将选定的相关隐藏字段值列表传递给控制器​​。指定的字段返回值是布尔值(true)。有超过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>

1 个答案:

答案 0 :(得分:1)

使用foreach循环不会生成绑定到集合所需的正确名称属性,您需要对for类型使用EditorTemplate循环或自定义Location表单控件包括索引器。有关如何命名集合的表单控件以及使用EditorTemplate的详细信息,请参阅this answer

要使用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>元素