2010-09-30 41 views
6

我有一个表单,其中也包含一大堆复选框和一些其他类型的控件。我需要检索每个选中的复选框的名称。从FormCollection获取所有选中的复选框

这样做的最好方法是什么?我可以用linq查询来做到吗?

所以在伪代码,我希望做这样的事情:

var names = formCollection 
       .Where(c => c is Checkbox && c.Checked) 
       .Select(c => c.Name); 

更新看来MVC提交复选框的办法就是从如何规范形式会表现得不同,作为一个隐藏字段是也呈现。我在这里找到了详细信息:How to handle checkboxes in ASP.NET MVC forms?

Anywho,我得到它的工作与该线程的帮助和从BuildStarted下面的答案。下面的代码做到了这一点。

var additionalItems = form.AllKeys 
     .Where(k => form[k].Contains("true") && k.StartsWith("addItem")) 
       .Select(k => k.Substring(7)); 
+0

感谢您的信息。我通常只是使用内置的模型绑定,并且从来没有真正看过有关复选框的输出到html的详细信息。 – Buildstarted 2010-09-30 15:42:29

回答

5

不幸的是,该类型的信息在该集合中不可用。不过,如果你在前面加上所有的复选框的东西,如<input type='checkbox' name='checkbox_somevalue' />那么你可以因为只有选中的值将被调回你不需要验证,他们正在检查像

var names = formCollection.AllKeys.Where(c => c.StartsWith("checkbox")); 

运行查询。

这里有一个,抓住唯一的检查值

var names = formCollection.AllKeys.Where(c => c.StartsWith("test") && 
         formCollection.GetValue(c) != null && 
         formCollection.GetValue(c).AttemptedValue == "1"); 
+0

我肯定会收到所有复选框,而不仅仅是选中的复选框。 – fearofawhackplanet 2010-09-30 15:12:47

+0

这很奇怪。快速测试显示情况并非如此。可能是特定的html造成的。但是''表单似乎不适用于我。不过,我已经更新了答案 – Buildstarted 2010-09-30 15:25:42

+0

我现在明白了。用更多的细节更新我的问题。谢谢你的帮助 :) – fearofawhackplanet 2010-09-30 15:33:35

0

这是不活跃多年的老问题之一,但我无意中发现了它。我的问题是,我有一个复选框 - 让我们说这个名字是'IsValid',并希望得到每个复选框的状态(我的项目是在MVC 5中)。在提交表单我做形式收集的循环,并得到了值...

if (key.Contains("IsValid")) 
        sV = (string[])collection.GetValue(key.ToString()).RawValue; 

由于对形式发布的隐藏字段的值还张贴与检查复选框;该数组仅包含一个附加值'仅用于检查复选框的'假'。为了摆脱我使用以下功能;我希望它能帮助别人,如果我的方法不对,那么更好的解决方案对我也有帮助!

sV = FixCheckBoxValue(sV); 

     private string[] FixCheckBoxValue(string[] sV) 
    { 
     var iArrayList = new List<string>(sV); 

     for (int i = 0; i < iArrayList.Count; i++) 
     { 
      if (iArrayList[i].ToString() == "true") 
      { 
       iArrayList.RemoveAt(i + 1); 
      }     
     } 
     return iArrayList.ToArray(); 
    } 
相关问题