注意:这个问题已经超过9年了!

您最好的选择是搜索更新的问题,或者搜索下面的答案,寻找您特定的MVC版本,因为这里的许多答案现在已经过时了。

如果你确实找到了适合你的版本的答案,请确保答案包含了你正在使用的MVC版本。 (原来的问题从下面开始)


这对我来说似乎有点奇怪,但据我所知,这就是你怎么做的。

我有一个对象集合,我希望用户从中选择一个或多个对象。这对我来说是“带复选框的表单”。我的对象没有任何“选定”的概念(它们是通过反序列化wcf调用形成的基本POCO)。所以,我这样做:

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

在视图中:

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

并且,在控制器中,这是我能看到的唯一方法来找出用户检查了什么对象:

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

首先,它很怪异,其次,对于用户选中的那些项,FormCollection将其值列出为“true false”而不仅仅是true。

显然,我遗漏了一些东西。我认为这是基于这样的想法构建的,即在html表单中所作用的集合中的对象是使用UpdateModel()或通过ModelBinder更新的。

但我的对象并不是为此而设置的;这意味着这是唯一的办法吗?还有别的办法吗?


当前回答

像这样的怎么样?

bool isChecked = false;
if (Boolean.TryParse(Request.Form.GetValues(”chkHuman”)[0], out isChecked) == false)
    ModelState.AddModelError(”chkHuman”, “Nice try.”);

其他回答

只需在$(document)上执行此操作。准备好:

$('input:hidden').each(function(el) {
    var that = $(this)[0];
    if(that.id.length < 1 ) {

        console.log(that.id);
        that.parentElement.removeChild(that);

    }
});

我很惊讶这些答案中没有一个使用内置MVC特性。

我在这里写了一篇关于这个的博客文章,甚至把标签链接到复选框。我使用EditorTemplate文件夹以一种干净和模块化的方式完成这一任务。

你只会在EditorTemplate文件夹中得到一个新文件,如下所示:

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

在你的实际视图中,不需要循环,只需一行代码:

@Html.EditorFor(x => ViewData.Model)

访问我的博客文章了解更多细节。

您还应该使用<label for="checkbox1">Checkbox 1</label>,因为这样人们就可以单击标签文本以及复选框本身。它也更容易设置样式,至少在IE中,当你通过页面的控件时,它会被突出显示。

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

这不仅仅是一件‘哦,我可以做到’的事情。这是一个显著的用户体验增强。即使不是所有用户都知道他们可以点击标签,很多人也会。

它们似乎选择只读取第一个值,所以当选中复选框时,这是“true”,而当只包括隐藏值时,这是“false”。这很容易用这样的代码获取:

model.Property = collection["ElementId"].ToLower().StartsWith("true");

HtmlHelper添加了一个隐藏输入来通知控制器未检查状态。 所以要有正确的检查状态:

bool bChecked = form[key].Contains("true");