当没有使用 Bootstrap 和 MVC5 的随附标签时,复选框输入严重对齐

Posted

技术标签:

【中文标题】当没有使用 Bootstrap 和 MVC5 的随附标签时,复选框输入严重对齐【英文标题】:Checkbox inputs badly aligned when there's no accompanying label using Bootstrap and MVC5 【发布时间】:2014-09-05 15:03:58 【问题描述】:

Bootply to play with

Visual Studio 2013 在为具有布尔值的模型构建编辑视图时生成以下 CShtml

<div class="form-group">
    @Html.LabelFor(model => model.IsUrgent, htmlAttributes: new  @class = "control-label col-md-2" )
    <div class="col-md-10">
        <div class="checkbox">
            @Html.EditorFor(model => model.IsUrgent)
         </div>
    </div>
</div>

通过 Razor 后你会得到这个:

<div class="form-group">
  <label class="control-label col-md-2" for="IsUrgent">Is bad :(</label>
   <div class="col-md-10">
    <div class="checkbox">
      <input class="check-box" data-val="true" id="IsUrgent" name="IsUrgent" type="checkbox" value="true">
      <input name="IsUrgent" type="hidden" value="false">
    </div>
  </div>
</div>

然而,Twitter Bootstrap 3.2 不喜欢这种使用标签的方式,因为结果如下:

请注意,复选框位置太靠左了。

如果我用一些空格将我的输入包装在一个虚拟标签中,即。

<div class="form-group">
    <label class="control-label col-md-2" for="IsUrgent">Is good!</label>

    <div class="col-md-10">
      <div class="checkbox">
        <label><input class="check-box" data-val="true" id="IsUrgent" name="IsUrgent" type="checkbox" value="true">
        <input name="IsUrgent" type="hidden" value="false">&nbsp;</label>
      </div>
    </div>
</div>

我明白了:

看起来不错,但它不是有效的 HTML:

label 元素最多可以包含一个 input、button、select、textarea 或 keygen 后代。

我的 CSS 类有什么问题吗?

编辑

如果我将第二个input 移到@Saranga 建议的label 之外,我仍然会留下没有语义功能的冗余label ...

【问题讨论】:

在site.css文件中包含规则是否有问题:.checkbox > input[type=checkbox] margin-left:0; ? 【参考方案1】:
<div class="checkbox">
    <label>
        @Html.CheckBoxFor(model => model.IsUrgent)
        @Html.DisplayNameFor(model => model.IsUrgent)
    </label>
</div>

【讨论】:

这将产生无效的 HTML,即。 label 元素最多可以包含一个 input、button、select、textarea 或 keygen 后代。【参考方案2】:

添加以下代码,而不是 @Html.EditorFor(model =&gt; model.IsUrgent)。您可以将隐藏字段放在label 标签之外。

<div class="checkbox">
    <label>
        <input class="check-box" data-val="true" id="IsUrgent" name="IsUrgent" value="true" type="checkbox"> &nbsp;
    </label>
    <input name="IsUrgent" type="hidden" value="false">
</div>

DEMO

谢谢!

【讨论】:

遗憾的是,MVC 模型绑定器需要隐藏字段 :(。这就是 @Html.EditorFor(model =&gt; model.IsUrgent) 输出它们的原因 没错,但我仍然坚持多余的label 我认为这不是多余的,因为在bootstrap中,我们将文本定义在复选框的末尾(getbootstrap.com/css/#forms),但是在您的情况下,您需要将标签保留在前面.所以我们需要带有&amp;nbsp; 的标签才能使bootstrap 样式起作用。所以我们可以使用这种方法作为替代方法。谢谢!【参考方案3】:

我实现了一个 Html Helper CheckBoxForBootstrap,它将复选框放在标签中,但没有任何标签文本,因此没有多余的标签,但您仍然可以获得所需的格式。 mvc模型绑定器需要的隐藏字段是在标签之后添加的,它应该是有效的html。

public static MvcHtmlString CheckBoxForBootstrap(this HtmlHelper htmlHelper, 
        string name, 
        bool isChecked)


    TagBuilder checkbox = new TagBuilder("input");
    checkbox.Attributes.Add("type", "checkbox");
    checkbox.Attributes.Add("name", name);
    checkbox.Attributes.Add("id", name);
    checkbox.Attributes.Add("data-val", "true");
    checkbox.Attributes.Add("value", "true");
    if (isChecked)
        checkbox.Attributes.Add("checked", "checked");

    TagBuilder label = new TagBuilder("label");
    //nest the checkbox inside the label
    label.InnerHtml = checkbox.ToString(TagRenderMode.Normal);

    TagBuilder hidden = new TagBuilder("input");
    hidden.Attributes.Add("type", "hidden");
    hidden.Attributes.Add("name", name);
    hidden.Attributes.Add("value", "false");

    return MvcHtmlString.Create(
    label.ToString(TagRenderMode.Normal) 
    + hidden.ToString(TagRenderMode.Normal)
    );

【讨论】:

【参考方案4】:

我遇到了同样的问题,只是在复选框周围的 div 上更改了类。试试:

    <div class="form-control-static">
        @Html.EditorFor(model => model.IsUrgent)
     </div>

【讨论】:

一个标签点击后会将焦点移到输入框,这个解决方案不会【参考方案5】:

警告:使用 CSS 的解决方案

我是这样解决的:

<div class="form-group">
    @Html.LabelFor(m => m.IsRequired2, new  @class = "control-label col-md-2" )
    <div class="col-md-2 checkbox-form">
        @Html.CheckBoxFor(m => m.IsRequired2)
    </div>
</div>

使用这个 CSS 类:

.checkbox-form 
    padding-top: 5px;

生成这个:

<div class="form-group">
    <label for="IsRequired2" class="control-label col-md-2">Good!</label>

    <div class="col-md-2 checkbox-form">
      <input value="true" name="IsRequired2" id="IsRequired2" type="checkbox">
      <input value="false" name="IsRequired2" type="hidden">
    </div>
</div>

可以看到here,它的优点是不会在复选框行之前或之后添加额外的垂直空间。

【讨论】:

【参考方案6】:
<div class="checkbox" style="margin: 5px 0 0 0;">
    <label for="remember" style="margin: 0;">
        <input name="remember" id="remember" type="checkbox" style="margin-top: 2px;">
        Remember me
    </label>
</div>

DEMO

【讨论】:

此解决方案将标签放在复选框的右侧【参考方案7】:

你可以试试我在我的 github 帐户上分享的一些代码:icheck-bootstrap

您可以在此处查看演示:

<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/bantikyan/icheck-bootstrap/9bd0c21a/icheck-bootstrap.min.css" />


<div class="checkbox icheck-primary">
    <input type="checkbox" id="someCheckboxId1" />
    <label for="someCheckboxId1">Clieck to check</label>
</div>

<div class="checkbox icheck-wisteria">
    <input type="checkbox" id="someCheckboxId2" />
    <label for="someCheckboxId2">Clieck to check</label>
</div>

【讨论】:

你链接的css超过24KB【参考方案8】:

只需删除围绕您的复选框和标签的“复选框”类的 div,问题就会消失

【讨论】:

【参考方案9】:
        <div class="form-group">
            <div class="checkbox">
                <div class="col-sm-2">
                    @Html.DisplayNameFor(m => m.IsUrgent)
                </div>
                <div class="col-sm-10">
                    <label>
                        @Html.CheckBoxFor(m => m.IsUrgent)
                    </label>
                </div>
            </div>
        </div> 

倒序

            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <div class="checkbox">
                        <label>
                            @Html.CheckBoxFor(m => m.IsUrgent)
                            @Html.DisplayNameFor(m => m.IsUrgent)
                        </label>
                    </div>
                </div>
            </div>

【讨论】:

这将产生无效的 HTML,即。 label 元素最多可以包含一个 input、button、select、textarea 或 keygen 后代。

以上是关于当没有使用 Bootstrap 和 MVC5 的随附标签时,复选框输入严重对齐的主要内容,如果未能解决你的问题,请参考以下文章

C# mvc5使用mvc5 +bootstrap+EF6搭建一个权限管理系统的心得体会

mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

在 MVC 5 中使用 bootstrap scrollspy

客户端验证在带有 Bootstrap 的 ASP.NET MVC5 中不起作用

ASP.NET MVC5 JQuery 数据表 CSS 不适用于 Bootstrap Lumen

使用 MVC5 C# 和 Razor 在局部视图中运行 javascript