【问题标题】:How to pass IEnumerable list to controller in MVC including checkbox state?如何将 IEnumerable 列表传递给 MVC 中的控制器,包括复选框状态?
【发布时间】:2013-06-06 22:24:44
【问题描述】:

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

  }

但是当我进入控制器操作时,我得到了 lstBlockedIPs 的空值。我需要在这里获取复选框状态。请帮忙。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 razor model-binding


    【解决方案1】:

    改用列表并将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(更具体地说,是输入字段的名称)以及我的示例和您的示例。然后比较一下,你就会明白为什么你的不起作用了。

    【讨论】:

    • 另外,原始源代码中的隐藏字段和复选框不在表单的using 块中。这可能是个问题。
    • 是的,没错。在我的回答中,我将它们移到表单中以明确这一点。
    • 如果我在局部视图中有 for 循环怎么办?
    • 当我想将自定义类的更新 IEnumerable 列表发送回使用表而不是for 还是 foreach? @model IEnumerable&lt;Laier_It.Models.Company&gt;@Html.ActionLink("City", "Index", new { orderBy = ViewBag.sortByCity, companyList = Model }) 只回发“companyList=Laier_It.Models.Company”
    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多