7

たくさんのチェックボックスと他のタイプのコントロールも含むフォームがあります。選択した各チェックボックスの名前を取得する必要があります。

これを行う最善の方法は何ですか?おそらくlinqクエリでそれを行うことはできますか?

したがって、疑似コードでは、次のようなことをしようとしています:

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

更新非表示フィールドもレンダリングされるため、MVC がチェックボックスを送信する方法は、通常のフォームの動作とは異なるようです。ここで詳細を見つけました: ASP.NET MVC フォームでチェックボックスを処理する方法?

とにかく、そのスレッドと以下の BuildStarted からの回答の助けを借りて、私はそれを機能させました。次のコードはそのトリックを行いました。

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

3 に答える 3

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");
于 2010-09-30T14:50:18.980 に答える
0

これは、何年もアクティブになっていない古い質問の 1 つですが、偶然見つけました。私の問題は、チェックボックスの配列があることでした-名前が「IsValid」で、各チェックボックスのステータスを取得したいとしましょう(私のプロジェクトはMVC 5にありました)。フォーム送信時に、フォーム コレクションのループを実行し、値を次のように取得しました...

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

フォームの投稿では、隠しフィールドの値もチェックボックスをオンにして投稿されました。配列には、チェックされたチェックボックスのみの「false」の追加値が1つ含まれていました。それらを取り除くために、次の関数を使用しました。それが誰かに役立つことを願っています。私のアプローチが間違っている場合は、より良い解決策が私にとっても役立つでしょう!

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();
    }
于 2014-05-19T08:59:45.600 に答える