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"> </label>
</div>
</div>
</div>
Я получаю это:
который выглядит неплохо, но недействителен HTML:
Элемент label может содержать не более одного входа, кнопки, select, textarea или потокового потомка.
Я делаю что-то не так с моими классами CSS?
Edit
Если я перемещаю второй input
вне label
, поскольку @Saranga предполагает, что я все еще остаюсь с избыточным label
, который не использует семантическую функцию...
Я реализовал 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)
);
}
<div class="checkbox">
<label>
@Html.CheckBoxFor(model => model.IsUrgent)
@Html.DisplayNameFor(model => model.IsUrgent)
</label>
</div>
Вместо @Html.EditorFor(model => model.IsUrgent)
добавить следующий код. Вы можете поместить скрытое поле вне тега label
.
<div class="checkbox">
<label>
<input class="check-box" data-val="true" id="IsUrgent" name="IsUrgent" value="true" type="checkbox">
</label>
<input name="IsUrgent" type="hidden" value="false">
</div>
Спасибо!
Предупреждение: решение с 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>
Как можно видеть здесь, у него есть преимущество не добавлять дополнительное вертикальное пространство до или после строки флажка.
<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>
У меня была такая же проблема, и я просто изменил класс на div, который сразу же включил этот флажок. Попробуйте:
<div class="form-control-static">
@Html.EditorFor(model => model.IsUrgent)
</div>
просто удалите div с классом "checkbox", окружающим ваш флажок и ярлык, и проблема исчезнет.
вы можете попробовать код, который я поделил в моей учетной записи 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>
<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>