【问题标题】:Checkbox always pass true value to controller MVC .Net复选框始终将真值传递给控制器​​ MVC .Net
【发布时间】:2019-08-09 16:06:24
【问题描述】:

我正在使用一个复选框来处理允许订购功能,它会生成下面的 HTML 代码:

@using (Html.BeginForm("EditFarm", "CustomerManagement", FormMethod.Post))
{
  @Html.AntiForgeryToken()
  @Html.ValidationSummary(true)
  @Html.HiddenFor(model => model.AllowOrder)

 <div>
   <label for="allowOrder">Allow Ordering</label>
   <br />
   <input type="checkbox" id="allowOrder" name="AllowOrder" value="true" @(Model.AllowOrder ? "checked" : "") />
 </div>
....
}

问题是复选框AllowerOrder 总是将true 值传递给控制器​​,即使它是unchecked

这是控制器中的代码:

public ActionResult EditFarm([Bind(Include = "Id, ERPCustomerCode, ERPId, CategoryId, Size, Large, OtherId, AllowOrder")] NewFarm farm)
        {
           ...
        }

尝试调试,收到的模型总是有AllowerOrder = true

我的代码有问题吗?任何帮助,将不胜感激! 谢谢!

【问题讨论】:

  • 在 Yauhen 的评论之上,您的复选框似乎没有绑定到 AllowOrder。这个更有可能绑定到它:@Html.HiddenFor(model =&gt; model.AllowOrder)
  • 你应该使用@Html.CheckboxFor。检查here
  • 很可能@Html.HiddenFor(model =&gt; model.AllowOrder) 会覆盖复选框值,因为它会生成&lt;input type="hidden" name="AllowOrder" /&gt;。请注意,这两个元素具有相同的 name 属性。
  • 我推荐使用@Html.CheckBoxFor,什么东西不起作用?这与checked 属性有关吗?我认为仅将name 属性与input 元素结合不足以绑定viewmodel 属性的复选框值。
  • 同意@TetsuyaYamamoto,a。删除 @Html.HiddenFor(model => model.AllowOrder) b。使用@Html.CheckBoxFor 而不是&lt;input type="checkbox" id="allowOrder" name="AllowOrder" value="true" @(Model.AllowOrder ? "checked" : "") /&gt;

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


【解决方案1】:

最可能的原因是您在使用&lt;input type="checkbox" /&gt; 之前使用HiddenFor 助手绑定到AllowOrder 属性,这将按此顺序生成输入元素:

<input name="AllowOrder" type="hidden" ... />

<input type="checkbox" id="allowOrder" name="AllowOrder" value="true" ... />

由于有 2 个输入元素具有相同的 name 属性值,因此只有第一个 &lt;input&gt; 元素将绑定到 viewmodel 属性,在您的情况下该属性包含 true 值。您应该使用@Html.CheckBoxFor() helper 并使用下面的辅助函数切换checked 属性,或者使用三元运算符,而不是手动创建复选框:

public object SetChecked(bool value)
{
    if (value)
    {
        return new { id = "allowOrder", @checked = "checked" };
    }
    else
    {
        return new { id = "allowOrder" };
    }
}

复选框

@* alternative 1 *@

@Html.CheckBoxFor(model => model.AllowOrder, @(SetChecked(Model.AllowOrder)))

@* alternative 2 *@

@Html.CheckBoxFor(model => model.AllowOrder, new { id = "allowOrder", @checked = @(Model.AllowOrder ? "checked" : "") })

注意: checked 是 C# 关键字,因此需要使用 @ 进行转义,以将其设置为呈现的 &lt;input type="checkbox" /&gt; 的 HTML 属性。

【讨论】:

  • 请注意,SetChecked 函数(如您所写)仅可用于一个复选框,因为您在没有参数的情况下设置了 id。因此我宁愿使用第二种选择,或者添加一个id 参数。
猜你喜欢
  • 2012-12-31
  • 2019-02-04
  • 1970-01-01
  • 2018-12-15
  • 2016-01-23
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多