web-dev-qa-db-ja.com

チェックボックスをMVCのint配列/列挙可能にバインドします

@Html.CheckBox("orderNumbers", new { value = 1 })
@Html.CheckBox("orderNumbers", new { value = 2 })
@Html.CheckBox("orderNumbers", new { value = 3 })
@Html.CheckBox("orderNumbers", new { value = 4 })
@Html.CheckBox("orderNumbers", new { value = 5 })

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { }

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { }

アクションメソッドで最初の署名を使用すると、空のIEnumerableが得られます。

2番目の署名を使用すると、値を受け取りますが、選択されていない値に対して誤った値も受け取ります(MVCパターンがすべてのチェックボックスを非表示フィールドでシャドウイングするため)。

例えばorderNumbers = { "1", "2", "false", "4", "false" }のようなものを受け取ります

番号のリストを取得できないのはなぜですか?

19

提供されたCheckBoxForヘルパーがどのように機能しているのか。

チェックボックスのhtmlを自分で生成する必要があります。その後、非表示の入力は生成されず、選択した整数値のみが取得されます。

7
Jan

次の方法で、チェックされたすべての値を取得できます。

コントローラーコード:

    public ActionResult Index()
    {            
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(string[] orderNumbers)
    {
        return View();
    }

コードを見る:

@using (Html.BeginForm())
{
    <input name="orderNumbers" type="checkbox" value="1" />
    <input name="orderNumbers" type="checkbox" value="2" />
    <input name="orderNumbers" type="checkbox" value="3" />
    <input name="orderNumbers" type="checkbox" value="4" />
    <input name="orderNumbers" type="checkbox" value="5" />

    <input type="submit" name="temp" value="hi" />
}

すべてのチェックボックスに同じ名前を付ける必要があることを覚えておいてください。配列では、チェックされているすべてのチェックボックスの値を取得します。

24
alok_dida

Alok_didaの素晴らしい答えに加えて。すべての値が整数であるため、コントローラーコードに整数の配列を取得させ、自分で変換を行わないようにすることができます。

これはMVC4 +で機能します。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int[] orderNumbers)
{
    return View();
}
5
David W Gray