复选框不适用于布尔视图模型属性

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中更新

分页列表不适用于具有多个模型的视图

@initbinder 不适用于特定的模型属性

Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型

使用数据注释强制模型的布尔值为真