如何将IEnumerable列表传递给控制器​​在MVC包括checkbox状态?

我有一个mvc应用程序,我正在使用这样的模型:

public class BlockedIPViewModel { public string IP { get; set; } public int ID { get; set; } public bool Checked { get; set; } } 

现在我有一个视图来绑定一个像这样的列表:

 @model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel> @using (Html.BeginForm()) { @Html.AntiForgeryToken() } @foreach (var item in Model) { <tr> <td> @Html.HiddenFor(x => item.IP) @Html.CheckBoxFor(x => item.Checked) </td> <td> @Html.DisplayFor(modelItem => item.IP) </td> </tr> } <div> <input type="submit" value="Unblock IPs" /> </div> 

现在我有一个控制器从提交button接收行动:

  public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs) { } 

但是当我来到控制器action时,我得到了lstBlockedIPs的空值。我需要在这里获得checkbox的状态。 请帮忙。

使用一个列表,并用for循环replace你的foreach循环:

 @model IList<BlockedIPViewModel> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @for (var i = 0; i < Model.Count; i++) { <tr> <td> @Html.HiddenFor(x => x[i].IP) @Html.CheckBoxFor(x => x[i].Checked) </td> <td> @Html.DisplayFor(x => x[i].IP) </td> </tr> } <div> <input type="submit" value="Unblock IPs" /> </div> } 

或者,您可以使用编辑器模板:

 @model IEnumerable<BlockedIPViewModel> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.EditorForModel() <div> <input type="submit" value="Unblock IPs" /> </div> } 

然后定义模板~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml ,它将自动为集合的每个元素呈现:

 @model BlockedIPViewModel <tr> <td> @Html.HiddenFor(x => x.IP) @Html.CheckBoxFor(x => x.Checked) </td> <td> @Html.DisplayFor(x => x.IP) </td> </tr> 

您在控制器中得到空值的原因是因为您不尊重默认模型联编程序预期成功绑定到列表的input字段的命名约定。 我邀请您阅读following article

一旦你阅读了,看看我的例子和你的生成的HTML(更具体地说,input字段的名称)。 然后比较,你会明白为什么你不工作。