检查复选框是否已选中MVC控制器

时间:2017-03-05 21:37:28

标签: c# asp.net-mvc checkbox

在我的MVC视图中,我有几个复选框:

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 
//Other code...
    <input name="test1" type="checkbox" />
    <input name="test2" type="checkbox"  />
</form>

在控制器上我使用POST请求 - 数据并将其插入数据库:

public void AddRegistered(Registration r)
{
//Other code...
     dParameters.Add("test1", r.test1.ToString());
     dParameters.Add("test2", r.test2.ToString());
//Other code...
}

问题是,即使选中了复选框,我仍然会获得false值。

我想失踪吗?

3 个答案:

答案 0 :(得分:1)

所以你要做的第一件事就是看看使用chrome调试工具或类似工具发送到服务器的实际数据。您可能会发现,如果选中,您的复选框值将设置为on,否则如果未选中则会完全丢失。

评论中的一个建议是@Html.CheckBoxFor,但是如果取消选中该复选框并且在特定情况下仍然可能成为问题,则会遇到任何问题。

您有两种解决方案 - 在客户端上修复它,或者在服务器上修复它。

将其修复到客户端
为此,您需要(使用javascript)为每个复选框添加隐藏字段。原谅我,我不是由编辑来测试它,但它可能看起来像这样(来自内存):

$('input[type="checkbox"]').each(function(el) {
    var hidden = $('<input type="hidden" />');
    hidden.name = el.name;
    el.after(hidden);
    el.on("change", function(el) {
       hidden.value = el.checked ? "true" : "false";
    });
});

将其修复在服务器上:
为此,您需要创建一个自定义PropertyBinder,将on识别为布尔值true。这将在属性属性级别设置。您也可以覆盖全局ModelBinder来执行此操作,这样您就不需要专门注释属性以使其工作。

就个人而言,我更喜欢“在客户端修复它”的方法,因为每次都会将truefalse发送回服务器,这是您所期望的,并且是最接近HtmlHelper的方式。

答案 1 :(得分:0)

您缺少value属性:

<input name="test1" type="checkbox" value="true" />
<input name="test2" type="checkbox" value="true" />

就这么简单。

答案 2 :(得分:0)

如果您不想使用HtmlHelper类,可以这样做

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 

<input name="test1" type="checkbox" value="@Model.test1" />
<input name="test2" type="checkbox" value="@Model.test2"  />

test1和test2应该在你的模型类中。