从FormCollection中获取所有选中的复选框

时间:2010-09-30 14:33:38

标签: asp.net-mvc controls webforms checkbox 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));

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

这是多年来不活跃的旧问题之一,但我偶然发现了它。我的问题是我有一系列复选框 - 假设名称为'IsValid'并且想要获取每个复选框的状态(我的项目在MVC 5中)。在表单提交上,我完成了表单集合的循环,并将值设为...

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

自表单发布以来,隐藏字段值也随检查复选框一起发布;对于仅检查复选框,该数组包含一个额外值'false'。摆脱我使用以下功能的那些;我希望它对某人有所帮助,如果我的方法错了,那么更好的解决方案对我也有帮助!

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();
    }