【问题标题】:Pass lists of selected relevant hidden field values form to the controller将选定的相关隐藏字段值表单的列表传递给控制器
【发布时间】:2015-05-11 13:41:50
【问题描述】:

谁能告诉我如何将选定的相关隐藏字段值列表从控制器传递给控制器​​。分配的字段返回值为 Boolean(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>

【问题讨论】:

  • 您不能使用foreach 循环绑定到集合(您正在生成重复的id 属性(无效的html)和name 与您的模型无关的属性(没有索引器) .您需要为模型使用for循环或自定义EditorTemplate。无论如何,为什么你有一个隐藏的属性Assigned输入,因为你有一个EditorFor(),所以它会被忽略属性。并且您的 POST 方法参数需要是您的模型(public ActionResult CAssigned(IEnumerable&lt;yourModel&gt;),因为这是您的视图所基于的。
  • 感谢您的重播。 @for(var i = 1; i
  • 您的模型需要实现IList,然后是for(int i = 0; i &lt; Model.Count; i++) { @Html.HiddenFor(m =&gt; m[i].LocationId .... },这将生成&lt;input name="[0].LocationId" ..&gt;&lt;input name="[1].LocationId" ..&gt;等。有关详细信息,另请参阅this answer
  • 谢谢斯蒂芬。当我更改我的控制器 public ActionResult CAssigned(IEnumerable) 时,它会出现预期的错误 1 ​​标识符。那是什么错误?
  • 您还需要为参数命名 - public ActionResult CAssigned(IList&lt;Location&gt; model) - 请注意我将其命名为 IList 以匹配您传递给视图的模型。现在model 将包含您可以循环并保存或任何您想做的集合。

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


【解决方案1】:

您使用 foreach 循环不会生成绑定到集合所需的正确名称属性,您需要使用for 循环或自定义EditorTemplate for typeof Location,以便表单控件包含索引器。请参阅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. &lt;input&gt; 不是&lt;tr&gt; 元素的有效子元素,因此请确保 您将它们包含在 &lt;td&gt; 元素中

【讨论】:

  • 感谢代码,我有一个问题 [HttpPost] public ActionResult CAssigned(IEnumerable){ return View() }。为什么错误出现“预期错误 1 ​​标识符”?我必须更改我的控制器吗?
  • 我已经更新了正确用法的问题 - 像任何方法一样,您需要定义参数的类型和名称 - 在您的情况下,您只包含类型 - IEnumerable&lt;Location&gt; - 但省略了名称参数的
  • 这个控制器怎么样 [HttpPost] public ActionResult CAssigned(Location location) { return View(); {
  • 查看更新。如果它是Location location,则意味着您的方法只接受一个Location 对象,但您的视图正在创建并回发多个对象,因此它将不起作用。如果您想回发一个Location,那么您的视图需要设计为编辑一个对象,而不是一个集合。
  • 感谢斯蒂芬的帮助,干得好。现在这个控制器可以工作了 public ActionResult CAssigned(IEnumerable model)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多