Asp.net mvc 如何处理ASP.NET MVC表单中的复选框? 注意:这个问题已经超过九年了!

Asp.net mvc 如何处理ASP.NET MVC表单中的复选框? 注意:这个问题已经超过九年了!,asp.net-mvc,forms,checkbox,Asp.net Mvc,Forms,Checkbox,您最好的选择是搜索较新的问题,或者搜索下面的答案,寻找您的特定版本的MVC,因为这里的许多答案现在已经过时了 如果您确实找到了适用于您的版本的答案,请确保答案包含您正在使用的MVC版本。 (原来的问题从下面开始) 这对我来说似乎有点奇怪,但据我所知,你就是这样做的 我有一个对象集合,我希望用户选择一个或多个对象。这对我来说是“带复选框的表单”。我的对象没有任何“已选择”的概念(它们是通过反序列化wcf调用形成的基本POCO)。因此,我做了以下工作: public class SampleObj

您最好的选择是搜索较新的问题,或者搜索下面的答案,寻找您的特定版本的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" />
<%}%>
首先,这很奇怪,其次,对于用户检查的项目,FormCollection将其值列为“true-false”,而不仅仅是true

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


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

以下是我一直在做的事情

视图:

我发现Html.*helper方法在某些情况下不太有用,我最好用普通的旧Html来做。这是其中之一,另一个浮现在脑海中的是单选按钮


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

Html.CheckBox做了一些奇怪的事情-如果您在结果页面上查看源代码,您将看到在每个复选框旁边生成了一个
,这解释了您看到的每个表单元素的“true-false”值

试试这个,它在ASP.NET MVC测试版上绝对有效,因为我刚刚试过

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


这个例子将只编写您选中的框的guid;ASP.NET MVC将所选复选框的GUID值映射到您的
GUID[]selectedObjects
参数中,甚至将Request.Form集合中的字符串解析为实例GUID对象,我认为这非常好。

HtmlHelper添加了一个隐藏输入,以通知控制器未检查状态。 因此,要获得正确的已检查状态:

bool bChecked = form[key].Contains("true");
您还应该使用
复选框1
,因为人们可以单击标签文本以及复选框本身。它也更容易设置样式,至少在IE中,当您通过页面控件进行制表时,它会高亮显示

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

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

如果您想知道为什么他们会将一个与复选框同名的隐藏字段放入,原因如下:

源代码MVCBetaSource\MVC\src\MvcFutures\MVC\ButtonsAndLinkExtensions.cs中的注释

为复选框呈现附加的
。 这解决了以下情况: 未选中的复选框不会发送进来 请求。发送隐藏输入 使我们有可能知道 检查时,页面上出现了复选框 请求已提交


我猜在幕后,他们需要知道这一点,以便绑定到控制器动作方法上的参数。然后,我想您可以有一个三态布尔值(绑定到一个可为null的bool参数)。我还没有尝试过,但我希望他们也这么做。

这个问题也发生在1.0版中。Html.Checkbox()导致添加另一个隐藏字段,其名称/id与原始复选框相同。当我尝试使用document.GetElemtentsByName()加载一个复选框数组时,您可以猜到事情是怎么搞砸的。这很奇怪。

他们似乎选择只读取第一个值,因此选中复选框时为“真”,而仅包含隐藏值时为“假”。这样的代码很容易获取:

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

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)
 $('input[type="checkbox"]').each(function () {
       $(this).attr('value', $(this).is(':checked'));
 }); 
public ActionResult UpdatePermissions(bool permission_1, bool permission_2)
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()" />

我还想指出,您可以为每个复选框命名不同的名称,并将该名称作为actionresults参数的一部分

例如

视图:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422
视图中的值将传递给操作,因为名称相同


我知道这个解决方案不适合你的项目,但我想我还是放弃这个想法。

@Dylan Beattie很棒的发现!!!我非常感谢你。为了进一步扩展,该技术还可以与视图模型方法完美结合。MVC非常酷,它足够聪明,可以通过绑定到视图的模型对象的相同名称将一组GUID绑定到属性。例如:

视图模型:

public class SampleViewModel
{
    public IList<SampleObject> SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

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

任何熟悉视图模型哲学的人都会感到高兴,这就像一个冠军

这就是我在使用Html.CheckBox(

<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>
选中4个复选框,未选中,未选中,选中,它会变为 真,假,假,假,真,假 进入 真,假,假,真。
正是我需要的

像这样的怎么样

bool isChecked = false;
if (Boolean.TryParse(Request.Form.GetValues(”chkHuman”)[0], out isChecked) == false)
    ModelState.AddModelError(”chkHuman”, “Nice try.”);
我的解决办法是:

<input type="checkbox"  id="IsNew-checkbox"  checked="checked" />     
<input type="hidden"  id="IsNew" name="IsNew" value="true"  />      
<script language="javascript" type="text/javascript" >     
  $('#IsNew-checkbox').click(function () {    
      if ($('#IsNew-checkbox').is(':checked')) {    
          $('#IsNew').val('true');    
      } else {    
          $('#IsNew').val('false');    
       }    
  });   
</script>  

$(“#IsNew复选框”)。单击(函数(){
if($('#IsNew复选框')。is(':checked'){
$('#IsNew').val('true');
}否则{
$('#IsNew').val('false');
}    
});   
您可以在这里找到更多信息:

当使用复选框HtmlHelper时,我更喜欢将已发布的复选框表单数据作为数组处理。我不知道为什么,我知道其他方法可以工作,但我认为我更喜欢尽可能将逗号分隔的字符串作为数组处理

因此,进行“检查”或真实测试将是:

//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 
//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 
进行虚假检查将是:

//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 
//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 
主要的区别是使用
GetValues
,因为它作为数组返回。

只需在
$(docu)上执行此操作即可
<input type="checkbox"  id="IsNew-checkbox"  checked="checked" />     
<input type="hidden"  id="IsNew" name="IsNew" value="true"  />      
<script language="javascript" type="text/javascript" >     
  $('#IsNew-checkbox').click(function () {    
      if ($('#IsNew-checkbox').is(':checked')) {    
          $('#IsNew').val('true');    
      } else {    
          $('#IsNew').val('false');    
       }    
  });   
</script>  
//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 
//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 
$('input:hidden').each(function(el) {
    var that = $(this)[0];
    if(that.id.length < 1 ) {

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

    }
});
@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)
@Html.EditorFor(x => ViewData.Model)
[HttpPost]
        public ActionResult Checkbox(int[] selectedObjects)
        {
            var selected = from x in selectedObjects
                           from y in db
                           where y.ObjectId == x
                           select y;                   

            return View(selected);
        }
 $('input[type="checkbox"]').each(function () {
       $(this).attr('value', $(this).is(':checked'));
 }); 
Contains("true");
var value = (bool)ValueProvider.GetValue("key").ConvertTo(typeof(bool));
var allPermissionsBase = Request.Params.AllKeys.Where(x => x.Contains("permission_")).ToList();
var allPermissions = new List<KeyValuePair<int, bool>>();

foreach (var key in allPermissionsBase)
{
     // Try to parse the key as int
     int keyAsInt;
     int.TryParse(key.Replace("permission_", ""), out keyAsInt);

     // Try to get the value as bool
     var value = (bool)ValueProvider.GetValue(key).ConvertTo(typeof(bool));
}
public ActionResult UpdatePermissions(bool permission_1, bool permission_2)
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()" />
// MVC Work around for checkboxes.
bool active = (Request.Form["active"] == "on");
 <% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
 <% } %>
<% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
<% } %>