2011-12-16 134 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(); 
}