【问题标题】:ASP.NET Core 2 MVC CheckBoxFor always returning false in modelASP.NET Core 2 MVC CheckBoxFor 在模型中总是返​​回 false
【发布时间】:2019-03-12 01:41:56
【问题描述】:

我知道有很多人遇到过这个问题,但我觉得他们从来没有解决过这个问题。

我有一个这样的剃须刀页面:

@model MyModel
<div>
    @using (Html.BeginForm("MyMethod", "Home", FormMethod.Get))
    {
        @Html.CheckBoxFor(model => model.MyBool)
        @Html.LabelFor(model => model.MyBool)
        <input type="submit" class="btn" value="Fire it up" />
    }
</div>

我的模型如下所示:

public class MyModel
{
    [DisplayName("My checkbox")]
    public bool MyBool {get; set;}
}

而我在 home 控制器中的方法是这样的:

public IActionResult MyMethod(MyModel model)
{
    return View();
}

在我看来一切都很好,但是,无论我是否选中复选框,在我提交表单后,MyMethod 方法中的模型参数总是为 false。

我做错了什么?

编辑:

当我选中复选框时,GET 请求包含两个值 - true 和 false。 我看到有人说 MVC 应该处理它,但它显然没有。

【问题讨论】:

  • 您的表单的 GET 请求是否发送了如下内容:MyBool=true&amp;MyBool=false?这与CheckBoxFor helper 如何生成 HTML 有关:stackoverflow.com/questions/2697299/…。检查model.MyBool 内的MyMethod 以确认此行为。
  • @TetsuyaYamamoto 是的,GET 请求看起来完全一样。无论复选框状态如何,MyMethod 中的 model.MyBool 值始终为 false。
  • 我尝试重现您的问题here,发现请求URL 查询字符串看起来与前面提到的完全一样,但MyBool 属性已正确设置为true。你能提供Core MVC版本来确定吗?
  • @TetsuyaYamamoto .NET Core 2.1
  • 我在自己的机器上使用了一个测试项目,按照以下步骤操作:选中复选框,提交表单,获取请求查询字符串 (/Home/MyMethod?MyBool=true&amp;MyBool=false) 并返回相同的视图,复选框仍处于选中状态,如您的问题中所述,未选中。调试器还提到MyBool在提交后设置为true

标签: asp.net-core razor asp.net-core-mvc checkboxfor


【解决方案1】:

所以,当您不选中 HTML 复选框时,会发生什么情况,默认发送的值为 null。 但是,当您使用 HTML 帮助程序 @Html.CheckBoxFor(model => model.MyBool) 时,它会按照您的要求自动为 MyBool 值创建一个复选框,另外还有一个 @Html.Hidden("MyBool",false)。这将做的是,如果 MyBool 没有任何值(如果未选中复选框),它将传递 False,而不是 null。

创建的 HTML:

  <input id="MyBool" name="MyBool" type="checkbox" value="true">
  <input name="MyBool" type="hidden" value="false">

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-10-04
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多