注意:这个问题已经超过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更新的。

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


当前回答

这是我在使用Html.CheckBox(…

Replace("true,false","true").Split(',')

选中4个箱子,不选中,不选中,再选中它 真的,假的,假的,假的,真的,假的 成 真的,假的,假的,真的。 这正是我所需要的

其他回答

我有几乎相同的问题,但我的控制器的返回值被其他值阻塞。

找到了一个简单的解决方案,但它似乎有点粗糙。

试着输入Viewbag。在你的控制器中,现在你给它一个像Viewbag这样的名字。Checkbool

现在切换到视图并尝试@Viewbag。使用Checkbool,你将从控制器中获取值。

我的控制器参数是这样的:

public ActionResult Anzeigen(int productid = 90, bool islive = true)

我的复选框会像这样更新:

<input id="isLive" type="checkbox" checked="@ViewBag.Value" ONCLICK="window.location.href = '/MixCategory/Anzeigen?isLive=' + isLive.checked.toString()" />

超文本标记语言CheckBox做了一些奇怪的事情——如果你在结果页面上查看源代码,你会看到每个复选框旁边都生成了一个<input type="hidden" />,这解释了你看到的每个表单元素的"true false"值。

试试这个,它肯定能在ASP上工作。NET MVC Beta版,因为我刚刚尝试过。

把它放在视图中,而不是使用Html.CheckBox():

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    <input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
    <%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

您的复选框都被称为selectedObjects,每个复选框的值是对应对象的GUID。

然后发布到下面的控制器动作(或做一些有用的事情而不是Response.Write())

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

这个例子只会写你选中的方块的guid;ASP。NET MVC将选中复选框的GUID值映射到GUID [] selectedObjects参数中,甚至解析来自请求的字符串。将集合形成实例化的GUID对象,我认为这是相当不错的。

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

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

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

    }
});

这是我一直在做的。

观点:


<input type="checkbox" name="applyChanges" />

控制器:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

我找到了Html。* helper方法在某些情况下不是很有用,我最好在普通的旧HTML中做它。这是其中之一,另一个想到的是单选按钮。

编辑:这是在预览5,显然是在版本之间的YMMV。

这是我在使用Html.CheckBox(…

Replace("true,false","true").Split(',')

选中4个箱子,不选中,不选中,再选中它 真的,假的,假的,假的,真的,假的 成 真的,假的,假的,真的。 这正是我所需要的