复选框始终将真实值传递给控制器​​MVC .Net

时间:2019-03-19 07:41:00

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

我正在使用一个复选框来处理allow Ordering函数,该函数会在下面生成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的值传递给Controller,即使其值为unchecked

这是Controller中的代码:

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

尝试调试,收到的模型始终具有AllowerOrder = trueenter image description here

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

1 个答案:

答案 0 :(得分:1)

最可能的原因是您在使用AllowOrder之前先使用HiddenFor帮助程序将其绑定到<input type="checkbox" />属性,这将按以下顺序生成输入元素:

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

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

由于有2个输入元素具有相同的name属性值,因此只有第一个<input>元素将绑定到viewmodel属性,该属性在您的情况下包含true值。与其使用<input>标签和隐藏字段分别手动创建复选框,不如使用@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#关键字,因此需要使用@对其进行转义以将其设置为呈现的<input type="checkbox" />的HTML属性。