我正在使用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 ???
答案 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