0

我正在使用一个复选框来处理允许订购功能,它会生成下面的 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在此处输入图像描述

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

4

1 回答 1

1

最可能的原因是您在using之前使用 helper绑定到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()帮助器和切换属性: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# 关键字,因此需要将其转义以@将其设置为 render 的 HTML 属性<input type="checkbox" />

于 2019-03-19T08:15:57.320 回答