ASP.NET Core Tag Helper Checkbox不保存未经检查的值

时间:2018-05-24 16:02:35

标签: asp.net-mvc asp.net-core asp.net-core-2.0 tag-helpers

我正在使用Tag Helpers在MVC表单中添加一个复选框:

<div class="form-group">
    <label asp-for="@Model.Billable"></label>
    <input asp-for="@Model.Billable" type="checkbox" />
    <input asp-for="@Model.Billable" type="hidden" />
</div>

当用户将值更改为Checked from Unchecked时,传回控制器的表单值为True - 完美。

但是,如果复选框的值以Checked开头并且用户将其更改为Unchecked,则传回控制器的表单值仍为True ???

1 个答案:

答案 0 :(得分:1)

当类型为checkbox时,输入标记助手会为您创建一个隐藏元素,并为您提供相同的name。如果您检查页面的查看源,您可以看到

<input name="Billable" type="hidden" value="false">

当用户启用/选中复选框并提交表单时,它将发送2个表单数据项,一个用于实际复选框,值为True,第二个用于隐藏输入,值为False

如果您检查网络流量(Chrome devtools-&gt;网络),您可以看到此

Billable: true
Billable: false

当模型绑定器使用此数据时,它将优先于True值并将其映射到您的布尔属性。

当用户取消选中该复选框并提交表单时,它将只发送一个表单数据元素,只发送一个值为false的隐藏输入元素,并且模型绑定器将为您设置false值你的动作方法参数的布尔值。

您当前的代码正在生成checkbox元素和一个名为Billable附加隐藏输入元素。所以基本上它将呈现2个输入元素(1个复选框,1个隐藏元素,助手创建,1个显式创建)。当用户取消选中该复选框时,它会为您明确创建的复选框发送True,为标记帮助程序创建的false发送Billable: True Billable: false

如果您检查网络流量(Chrome devtools-&gt;网络),您可以看到此

True

模型绑定器将使用此信息并将值<div class="form-group"> <label asp-for="@Model.Billable"></label> <input asp-for="@Model.Billable" type="checkbox" /> </div> 映射到视图模型的Billable属性。

解决方案是删除额外的隐藏元素,并依赖于标记助手创建的元素。

http://localhost:8983/solr/gencat.imagemetadata/select?q=id:"TH-1961-46483-10968-9"&wt=json&indent=true&facet=true&facet.field=externalid