2011-12-16 7 views
16
@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が返されます。バインドMVCの配列/列挙型のチェックボックス

私は2番目の署名を使用する場合、私は値を受け取りますが、選択されていない値に対してはfalse値を受け取ります(隠しフィールドを持つすべてのチェックボックスをシャドウするMVCパターンのため)。

orderNumbers = { "1", "2", "false", "4", "false" }

なぜ数字のリストを取得できないのですか?

答えて

8

これは、提供されたCheckBoxForヘルパーがどのように動作しているかを示しています。

自分でチェックボックスのhtmlを生成する必要があります。隠れた入力は生成されず、選択された整数値だけが得られます。

+0

、もちろん私がやります。ばかみたい!私は間違って、彼らが要求された型に縛られないならば、偽の値を無視するために型バインダーで何かを賢明にしたと思います。 – fearofawhackplanet

23

以下の方法ですべてのチェック値を取得できます。

コントローラーコード:

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" /> 
} 

あなたはすべてのチェックボックスに同じ名前を付ける必要がある、というのが私の心に一つのことを保管してください。配列では、チェックされたすべてのチェックボックスの値が取得されます。

5

alok_didaの偉大な答えに加えて。すべての値が整数なので、コントローラコードで整数の配列を取り、自分で変換するのを避けることができます。

これはMVC4 +で動作します:確かに

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