【问题标题】:Check if checkbox is checked MVC controller检查复选框是否选中 MVC 控制器
【发布时间】:2017-03-06 13:47:43
【问题描述】:

在我的 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 值。

我错过了什么?

【问题讨论】:

  • 使用 Html.CheckBoxFor 而不是使用手动 HTML。
  • 需要使用手动HTML,我不能使用Razor。
  • 复选框回发其控件的值已被选中(如果未选中则不选中。您的设置 value="false" 所以它可以提交的所有内容都是 false。如果您不使用HtmlHelper 方法,然后不要费心使用 mvc,因为你永远不会得到正确的模型绑定。
  • 对不起,我忘了删除 value="false" 这是我的测试之一,你能解释一下你的意思吗:如果你不使用 HtmlHelper 方法,那么就不要费心使用 mvc,因为你永远不会得到正确的模型绑定。 完全理解你的意思对我来说非常重要。谢谢!
  • @StephenMuecke:我一直在 ASP.Net 中生成手动表单,更不用说使用 javascript 等发布到 MVC 控制器中。说唯一可以将数据发布到 MVC 的东西是 HtmlHelper 是天真。

标签: c# asp.net-mvc checkbox


【解决方案1】:

因此,您应该首先查看使用 chrome 调试工具或类似工具发送到服务器的实际数据。您可能会发现,如果选中,您的复选框值将设置为 on,如果未选中,它将完全丢失。

cmets 中的一个建议是 @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 做到了。

【讨论】:

  • 如果未选中复选框,则不会发送任何内容 完全错误! - @Html.CheckBoxFor() 正确生成 2 个输入,一个带有 Value="True 的复选框和一个带有 value="False" 的隐藏输入
  • 也许你是对的,我现在无法检查 - 但我不得不放弃 HtmlHelper 并之前手动执行此操作,因为我没有收到错误值回传到服务器。可能是一个单独的问题,不确定。
【解决方案2】:

您缺少value 属性:

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

就这么简单。

【讨论】:

    【解决方案3】:

    如果你不想使用 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 应该在你的模型类中。

    【讨论】:

    • 您也可以使用&lt;input name="@( nameof(@Model.test1 ) )" /&gt; - 尽管这不适用于嵌套/子视图或复杂的视图模型。
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 2012-05-10
    • 2021-07-16
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多