如何在MVC中传递IEnumerable列表到控制器,包括复选框状态

本文关键字:控制器 包括 状态 复选框 列表 IEnumerable MVC | 更新日期: 2023-09-27 18:17:45

我有一个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>

现在我有一个控制器来接收来自提交按钮的操作:

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

但我得到空值lstblockedip当来到控制器动作。我需要得到这里的复选框状态。请帮助。

如何在MVC中传递IEnumerable列表到控制器,包括复选框状态

使用列表代替foreach循环并将for循环替换为:

@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>

你在控制器中得到null的原因是因为你没有尊重默认模型绑定器期望成功绑定到列表的输入字段的命名约定。我邀请你阅读following article

阅读后,看看我的示例和您的示例生成的HTML(更具体地说,是输入字段的名称)。然后比较一下,你就会明白为什么你的程序不起作用了。