复选框不适用于布尔视图模型属性
Posted
技术标签:
【中文标题】复选框不适用于布尔视图模型属性【英文标题】:Checkbox not working with boolean viewmodel property 【发布时间】:2016-02-16 15:59:49 【问题描述】:我正在使用 MVC6 并且在我的表单中有一个复选框输入字段,但是当提交表单时,复选框的值总是作为 false 传递给 ViewModel:
这是在我的 ViewModel 中声明属性的方式:
[Display(Name = "Include Sales Tax")]
public bool IncludeSalesTax get; set;
这是我的 MVC6 razor 表单中的表单外观:
<div class="form-group">
<div class="checkbox">
<label><input asp-for="IncludeSalesTax" type="checkbox" value="">@html.DisplayNameFor(m => m.IncludeSalesTax)</label>
</div>
</div>
我认为上述方法是遵循 Twitter Bootstrap 标准并使用 ASP.NET MVC6 asp-for 标签进行模型绑定的最佳方式。
当我提交表单时,IncludeSalesTax 的值始终为 false,即使选中时也是如此。我做错了什么?
【问题讨论】:
取决于您的文档类型声明。输入是 void 元素,在 HTML5 中不需要结束标记。更有可能是由于空值属性。 【参考方案1】:如果设置了输入类型复选框,则会发送一个“on”。否则不发送。 重要的是,您将 value 属性设置为 true。在这种情况下,它发送真或空,这非常适合绑定到布尔值。
<input type="checkbox" name="yourPropertyName" value="true" checked />
【讨论】:
这很有帮助! 真的很有帮助! 非常感谢!让 ASP.NET 与 HTML 和 HTTP 一起工作的有时奇怪且大量未记录的方法的另一个小瞥见。你拯救了我的一天:-] 我们必须经历的圈套...... smh。但是谢谢你给我看篮筐!【参考方案2】:razor 视图引擎通常使用相同的名称创建一个复选框和一个隐藏输入。
您可以简单地使用下面的 html 来确保获得您想要的结果:
<div class="form-group">
<div class="checkbox">
<input type="checkbox" value="true" name="IncludeSalesTax" />Include Sales Tax
<input type="hidden" value="false" name="IncludeSalesTax" />
</div>
</div>
【讨论】:
【参考方案3】:如果复选框应默认为选中状态,Pinki 的上述回答很好。
如果复选框应默认为未选中,则在单击时,一些内嵌 javascript 会将该值设置为 true 或 false:
<input name="yourPropertyName" type="checkbox" value="false" onchange="this.value=this.checked">
【讨论】:
对我来说最好的答案+1【参考方案4】:在让 Visual Studio 根据我的 ViewModel 生成表单后,它是如何做到的:
<div class="checkbox">
<input asp-for="isTaxable" />
<label asp-for="isTaxable"></label>
</div>
此外,我错过了输入标签的关闭。所以它也可以这样做,这是引导首选的方式:
<label><input asp-for="isTaxable" type="checkbox" value=""/>@Html.DisplayNameFor(m => m.isTaxable)</label>
【讨论】:
您缺少的是输入标签末尾的斜杠。这使您的标记无效。 在这里帮助我的是明确使用value=""
。如果属性value
不存在,即使模型上的bool
属性为假,我的表单也会呈现value="true"
。使用 aspnet 6 进行测试。以上是关于复选框不适用于布尔视图模型属性的主要内容,如果未能解决你的问题,请参考以下文章
knockout.js remove 不适用于主视图模型中的嵌套视图模型和视图模型
[DataGridCheckBoxColumn在属性更改时不会在MVVM中更新