MVC绑定到复选框

TBD*_*TBD 11 asp.net-mvc

我已经发现了很多这方面的问题,但是没有一个问题可以解决,或者似乎无法完成我的工作.我有一个模特:

public class CheckBoxModel
{
            public int Id{ get; set; }
    public bool IsSelected { get; set;  }
}
Run Code Online (Sandbox Code Playgroud)

然后尝试将我的IsSelected bool绑定到这样的复选框:

<%= Html.CheckBox("IsSelectedCheck",Model.IsSelected)%>
Run Code Online (Sandbox Code Playgroud)

我在页面上有很多项目,它们旁边都有一个复选框,我想要做的就是将所有项目的ID和已选择的项目传回控制器.

目前,IsSelected的值始终为false.每次用户切换复选框时,Html.CheckBox是否应设置Model.IsSelected的值.

谢谢

Dar*_*rov 26

试试这样:

<%= Html.CheckBoxFor(x => x.IsSelected) %>
Run Code Online (Sandbox Code Playgroud)

此外,如果你想传递id不要忘记这样做:

<%= Html.HiddenFor(x => x.Id) %>
Run Code Online (Sandbox Code Playgroud)

如果你收集了这些:

public class MyViewModel
{
    public CheckBoxModel[] CheckBoxes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你可以:

<% for (var i = 0; i < Model.CheckBoxes.Length; i++) { %>
    <div>
        <%= Html.HiddenFor(x => x.CheckBoxes[i].Id) %>
        <%= Html.CheckBoxFor(x => x.CheckBoxes[i].IsSelected) %>
    </div>
<% } %>
Run Code Online (Sandbox Code Playgroud)

哪个会成功绑定到:

[HttpPost]
public ActionResult MyAction(MyViewModel model) 
{
    // model.CheckBoxes will contain everything you need here
    ...
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*NET 18

达林的绝佳答案的另一种选择

我绝对建议遵循Darin的方法来返回大部分时间的课程.如果您需要的只是经过检查的ID,这个替代方案是"快速"和肮脏的黑客:

<% foreach (var cb in Model.CheckBoxes) { %>
  <div>
    <input type="checkbox" 
      value="<%= cb.Id %>"
      <%= cb.IsSelected ? "checked=\"checked\"" : "" %>
      name="ids" />
  </div>
<% } %>
Run Code Online (Sandbox Code Playgroud)

将绑定到int[] ids以下操作中的参数:

[HttpPost]
public ActionResult MyAction(int[] ids) 
{
    // ids contains only those ids that were selected
    ...
}
Run Code Online (Sandbox Code Playgroud)
  • 好处是更清晰的HTML,因为没有隐藏的输入.
  • 成本是在视图中编写更多代码.

在MVC 4.0(Razor 2.0)中,您可以在视图中使用以下语法:

<input type="checkbox" value="@cb.Id" checked="@cb.IsSelected" name="ids" />
Run Code Online (Sandbox Code Playgroud)