2011-12-16 61 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將複選框綁定到int數組/ MVC中的枚舉

如果我用的是第二個簽名我確實收到了值,但我也收到未選定值的假值(因爲陰影的所有複選框以隱藏字段的MVCS模式)。

例如我會收到類似orderNumbers = { "1", "2", "false", "4", "false" }

爲什麼我就不能得到號碼列表?

回答

8

,因爲提供的CheckBoxFor助手是如何工作的,多數民衆贊成。

你要生成的複選框自己的HTML。然後隱藏的輸入不會生成,您將只獲得所選的整數值。

+0

事實上,我當然有。真是個傻瓜!我錯誤地認爲,如果它們不能綁定到請求的類型,他們會在模型聯編程序中做一些巧妙的事情來忽略錯誤值。 – fearofawhackplanet 2011-12-16 12:24:53

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