【发布时间】:2015-10-09 20:40:41
【问题描述】:
我正在为复选框使用带有自定义 CSS (.less) 的模板(使它们显示为“是|否”、“开|关”等)
使用@Html.CheckboxFor(model => model.BooleanProperty, new { @class="custom-switch" }) 会导致复选框根本不出现。
所以我开始四处寻找,在这里发现了许多类似问题的问题,但到目前为止,没有一个解决方案对我有用。我目前正在研究的解决方案是使用自定义 EditorFor 模板。这是正确渲染复选框,但是,我遇到的是,如果滑块切换到“否”,它会作为空而不是假传递给控制器,如果它切换到“是”,它会传递到控制器为“开”。
我知道 Html.CheckboxFor 呈现一个复选框元素,后跟一个隐藏的输入元素。这是为了什么目的?以下是从这两种方法呈现的 HTML 以及与该特定方法相关的任何问题:
复选框的纯 HTML ::之前 ::之后
这个传给控制器的时候,为什么BoolProperty的值是"true,false"?
@Html.CheckboxFor(model => model.BoolProperty, new { @class="custom-switch" })
<input checked="checked" data-val="true" data-val-required="The BoolProperty is required." id="BoolProperty" name="BoolProperty" type="checkbox" value="true" class="custom-switch">
<input name="BoolProperty" type="hidden" value="false">
隐藏的输入字段有什么作用?如果我没记错的话,无论如何只有第一个“BoolProperty”命名值实际上会被传递给控制器。我找不到任何建议当值更改时一个更新另一个,并且通过测试,我注意到值没有改变。
@Html.EditorFor(model => model.BoolProperty, new { @class= "custom-switch" })
<input type="checkbox" checked name="BoolProperty" class="custom-switch">
<label>::before ::after</label>
为什么这会将"on" 或null 的值传递给控制器?为什么不true 和false?
布尔编辑器模板
@model Boolean?
var isChecked = ViewData["checked"] != null && ViewData["checked"].ToString() == "true";
<input type="checkbox" checked="@(isChecked ? "checked" : string.Empty)" name="@name" class="@ViewData["class"].ToString()" />
<label class="lbl"></label>
【问题讨论】:
标签: css asp.net-mvc razor checkbox