我正在使用一个复选框来处理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 = true
。
我的代码有问题吗?任何帮助,将不胜感激! 谢谢!
答案 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属性。>