有没有办法将复选框列表绑定到asp.net mvc中的模型

Eri*_*ick 12 c# asp.net asp.net-mvc .net-3.5 asp.net-mvc-2

我在这里寻找一种快速简便的方法来绑定模型中发生回发时的复选框列表项列表.

显然,现在这样做的常见方式似乎就是这样做form.GetValues("checkboxList")[0].Contains("true");似乎很痛苦而且不完全安全.

有没有办法绑定复选框列表(在视图中使用或不使用帮助程序创建),或者甚至是在UpdateModel(myViewModel, form.ToValueProvider());填充模型内部IList<string>string[]内部的阶段中的数据数组?

Dar*_*rov 9

你可以从一个模型开始:

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

然后一个控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new[] 
        {
            new MyViewModel { Id = 1, IsChecked = false },
            new MyViewModel { Id = 2, IsChecked = true },
            new MyViewModel { Id = 3, IsChecked = false },
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        // TODO: Handle the user selection here
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

一个视图(~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %>
    <%=Html.EditorForModel() %>
    <input type="submit" value="OK" />
<% } %>
Run Code Online (Sandbox Code Playgroud)

最后是相应的编辑器模板:

<%@ Control 
    Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.MyViewModel>" %>
<%= Html.HiddenFor(x => x.Id) %>
<%= Html.CheckBoxFor(x => x.IsChecked) %>
Run Code Online (Sandbox Code Playgroud)

现在,当您在POST操作中提交表单时,您将获得所选值的列表及其ID.

  • @Erick,当然它可以工作.您的视图模型现在将包含简单的属性,如`Username`和`Password`,以及一个集合属性`IEnumerable <MyViewModel>`,它将包含复选框信息.现在不是在表单中使用`Html.EditorForModel`,而是使用简单的`<%= Html.TextBoxFor(x => x.Username)%>`和`<%= Html.PasswordFor(x => x.Password) %>`和`<%= Html.EditorFor(x => x.MyCheckboxes)%>`将呈现相同的编辑器模板. (2认同)

Cod*_*nis 9

这是快速简便的方法.只需valuecheckbox输入元素中设置属性并为它们提供相同的属性即可name.如果我是在一个站点上实现这一点,我将创建一个CheckBox辅助方法需要name,valueisChecked参数,但这里的视图只需要在html:

<% using (Html.BeginForm()) { %>
  <p><input type="checkbox" name="checkboxList" value="Value A" /> Value A</p>
  <p><input type="checkbox" name="checkboxList" value="Value B" /> Value B</p>
  <p><input type="checkbox" name="checkboxList" value="Value C" /> Value C</p>
  <p><input type="checkbox" name="checkboxList" value="Value D" /> Value D</p>
  <p><input type="checkbox" name="checkboxList" value="Value E" /> Value E</p>
  <p><input type="checkbox" name="checkboxList" value="Value F" /> Value F</p>
  <input type="submit" value="OK" />
<% } %>
Run Code Online (Sandbox Code Playgroud)

在您的控制器中:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(IEnumerable<string> checkboxList)
{
    if (checkboxList != null)
    {
        ViewData["Message"] = "You selected " + checkboxList.Aggregate("", (a, b) => a + " " + b);
    }
    else
    {
        ViewData["Message"] = "You didn't select anything.";
    }

    return View();
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable<string>参数(你可以把它IList<string>如果你想)将包含已选中的项目只值.这将是null,如果没有箱子进行检查.

  • 这是正确的答案.如果你试图使用内置的`Html.CheckBox()`助手,他们**坚持**插入带有`value ="false"`的隐藏字段,这会干扰模型绑定. (2认同)