代码之家  ›  专栏  ›  技术社区  ›  fearofawhackplanet

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

  •  6
  • fearofawhackplanet  · 技术社区  · 16 年前

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

    最好的方法是什么?我可以用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?

    var additionalItems = form.AllKeys
           .Where(k => form[k].Contains("true") && k.StartsWith("addItem"))
                   .Select(k => k.Substring(7));
    
    2 回复  |  直到 9 年前
        1
  •  5
  •   Buildstarted    16 年前

    很遗憾,该类型的信息在集合中不可用。但是如果你在所有的复选框前都加上 <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");
    
        2
  •  0
  •   user3104116    12 年前

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

    因为在表单post上,隐藏字段值也与复选框一起发布;数组包含一个附加值“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();
        }