2009-06-08 91 views
9

我见过很多关于这个话题的问题。asp.net MVC复选框头痛!

我使用asp.net MVC 1.0

问题区域

如果我使用

<%= Html.CheckBox("Status", true) %> 

那么,为什么它使得像

<input checked="checked" id="Status" name="Status" type="checkbox" value="true" /><input name="Status" type="hidden" value="false" /> 

我把这个foreach循环我有5排。

当我提交表单与真的,真的,真的,假的,假的 然后我得到true,false,true,false,true,false,false,false

即虚假=>假的。

真正=>真,假

如果我使用

<input type="checkbox" value="true" name="Status" checked="checked" /> 

然后,我没有得到一个未经检查的。

那么我该如何克服这个问题呢?

请不要在formcollection对象中使用循环发布答案,并检查每个键!

+1

复制? http://stackoverflow.com/questions/220020/how-to-handle-checkboxes-in-asp-net-mvc-forms – Peter 2009-06-08 09:41:15

回答

0

它呈现,因为默认联编程序需要FormCollection具有非空值参数的值。使用这种技术,我们确信即使复选框未被选中(默认情况下只有在选中时才会发送该值),该值也会被发送。如果你使用这种控制器的方法只有一个HTML输入你会得到成形后与未选中的复选框的错误(复选框的值将不会被公布和粘合剂会不知道用什么isItemSelected值):

public ActionResult SomeActionMethod(bool isItemSelected) 

您可以尝试使用这样的事情只有一个HTML输入:

public ActionResult SomeActionMethod(bool? isItemSelected) 

但在这种情况下isItemSelected将是无效的或将是真实的。它永远不会变成虚假的。

1

在您的例子,当你提交表单与真的,真的,真的,假的,假的,你会得到

true,false,true,false,true,false,false,false
这是有趣的是,你实际上并没有得到八个值回来了,但5个阵列,仅仅看起来像这样,因为所有的值都被加入。

我知道你问没有得到一个循环的回答,但我可以用一个展示什么是真正发生在这里:

foreach (string key in postedForm.AllKeys) { 
    // "value" will contain a joined/comma-separated list of ALL values, 
    // including something like "true,false" for a checked checkbox. 
    string value = postedForm[key].GetValue; 
    // "values" will be an array, where you can access its first element, 
    // e.g., values[0], to get the actual intended value. 
    string[] values = postedForm.GetValues(key); 
} 

因此,对于您选中的复选框,你会得到一个数值数组有两个元素,而对于未选中的框,您将只获得一个单元素数组。

因此,要回答你的问题你如何克服这个问题,答案在于使用GetValues而不是GetValue,并且将你的发布字段视为数组而不是字符串。

祝你好运!

+0

与.Net4.0的MVC3没有GetValues – 2011-05-06 18:40:16

0

那么有几种方法可以根据您的要求来做。

我使用这种方法。

<input type="checkbox" value="<%= item.ID %>" name="check" checked="checked")" /> 

这可能是复选框。

在服务器端,我也会在模型中拥有一组ID。 所以我检查它是否在数组

var strArray = form["checkbox"]; //Request.form["checkbox"] or "FormCollection form" in action parameter; array of ID's in comma separated string. 

不同的人有不同的测试。

2

我知道这是不是一个优雅的,但是这是我做的:。

收集[“回应”]替换(“真,假”,“真”),斯普利特(“”) .ToList();

+0

这在MVC3和框架4 – 2011-05-06 18:44:19

0

这是为了使用才刚刚简单的复选框,你要的是CheckBoxList的,这还没有包括ASP.net MVC

的API中如果您寻找一些东西像checkboxlist,也许你应该写自己的帮手,让你明白HTML很好..

就是这样! :)

0

容易只是检查是否AttemptedValue.Contains(“真”) - 它,如果它的检查,而不是它是否被选中....

1

我个人认为不必检查“真的,假的“服务器上的任何地方都是一种痛苦。我写了一个jquery修复程序,它将删除Html.Checkbox助手创建的额外隐藏字段,如果该框未选中,则将其添加回去。服务器值始终为“真”或“假”。复选框列表在您希望他们采取行动的方式上具有主观性,我将讨论这些主题,但我会从值集中移除“false”,这意味着如果未选中列表中的所有框,表单值将被排除。

http://www.mindstorminteractive.com/blog/?p=386

我已经使用这种技术相当不错的成功。如果您尝试并发现问题,请告诉我。

1

你必须为CheckBox值做你自己的模型绑定。

获得从的FormCollection的Request.Form或为复选框ID值的列表,并更换真,假与真正:

string chkBoxString = Request.Form["checkboxID"].Replace("true,false", "true") 

现在你有是否选择与否CheckBox的列表.. ..做休息:)自己

0

在查看:

<input id="radio5" type="checkbox" name="rb_abc" value="5"/> 

控制器:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult YourForm(FormCollection fc) 
{ 
     if (fc["rb_abc"] == "on") 
     { 
      //Hey .. you have selected a Radio Button.. just kidding.. its a CheckBox 
     } 
} 
0

连得复选框值是true或false

var boolValue = bool.Parse(collection.GetValues("checkboxID")[0])