Html.CheckBox返回值不是true / false

时间:2013-06-03 13:19:51

标签: c# asp.net-mvc-3 checkbox

这看起来很荒谬,但你只能从MVC复选框返回true / false吗?我记得当天(在经典的asp中)从勾选的复选框中返回一个值是完全有效的,但微软似乎认为复选框应该只包含真/假值。

因此,如果您添加以下内容:

@Html.CheckBox("PropertyTypes", true, new {@value="A"})

我希望我的表单POST包含Property=A,我最终得到的是Property=A&Property=true然后打破模型,所以我在属性中得到null而不是字符串I想要的。

经过调查后发现,这是因为微软增加了一个额外的输入所以如果我不想检查输入,我会得到一个错误的... ...非常感谢.... ..:/

<input id="PropertyTypes" type="checkbox" value="Hotel" name="PropertyTypes" data-val-youmustselectatleastone="You must select at least one Property Type" data-val="true" checked="checked">
<input type="hidden" value="false" name="PropertyTypes">

WHY!

我只能使用平面HTML编写输入代码,但随后我放弃了所有不引人注目的验证。

关于如何摆脱这种愚蠢的想法?

Ps复选框的数量是动态的,因此为每个值添加一个属性不会削减它。

1 个答案:

答案 0 :(得分:9)

  

这看起来很荒谬,但你只能从MVC复选框中返回true / false吗?

我觉得这很荒谬。当你给它第二个想法时,建模一个布尔变量的检查/未检查状态实际上是有意义的。

  

WHY!

因为框架的设计者决定实现CheckBox帮助器。

  

关于如何摆脱这种愚蠢的想法?

当然使用视图模型:

public class MyViewModel
{
    public int Id { get; set; }
    public bool IsChecked { get; set; }
}

然后假设您有一个集合,您将使用复选框和隐藏字段来存储项目的相应ID:

@Html.HiddenFor(x => x.SomeCollection[i].Id)
@Html.CheckBoxFor(x => x.SomeCollection[i].IsChecked)

提交表单后,您将获得包含商品ID的集合属性以及是否已选中它们。