Visual Studio 2013 génère le CSHTML suivant lors de l'échafaudage d'une vue d'édition pour un modèle avec un booléen:
<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>
Après avoir traversé Razor, vous obtenez ceci:
<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 n'aime cependant pas cette façon d'utiliser les étiquettes car c'est le résultat:
Notez que la case à cocher est positionnée trop à gauche.
Si j'encapsule mon entrée dans une étiquette factice avec un espace, par exemple.
<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>
J'ai compris:
qui a l'air sympa mais ce n'est pas du HTML valide:
L'élément label peut contenir au plus une entrée, un bouton, une sélection, une zone de texte ou un descendant de keygen.
Suis-je en train de faire quelque chose de mal avec mes classes CSS?
Modifier
Si je déplace le deuxième input
en dehors du label
comme le suggère @Saranga, je reste avec le label
redondant qui ne sert à rien de sémantique ...
J'ai implémenté un Html Helper CheckBoxForBootstrap qui place la case à cocher dans une étiquette mais sans aucun texte d'étiquette donc il n'y a pas d'étiquette redondante mais vous obtenez toujours la mise en forme souhaitée. Le champ masqué requis par le classeur de modèle mvc est ajouté après que l'étiquette doit être en html valide.
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>
Au lieu de @Html.EditorFor(model => model.IsUrgent)
ajoutez le code suivant. Vous pouvez placer le champ masqué en dehors de la balise 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>
Merci!
<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>
Avertissement: Solution avec CSS
Je l'ai résolu de cette façon:
<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>
En utilisant cette classe CSS:
.checkbox-form {
padding-top: 5px;
}
Ce qui génère ceci:
<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>
Comme on peut le voir ici , il a l'avantage de ne pas ajouter d'espace vertical supplémentaire avant ou après la ligne de case à cocher.
J'ai eu le même problème et j'ai juste changé la classe sur le div entourant immédiatement la case à cocher. Essayer:
<div class="form-control-static">
@Html.EditorFor(model => model.IsUrgent)
</div>
vous pouvez essayer du code que j'ai partagé sur mon compte github: icheck-bootstrap
Vous pouvez voir la démo ici:
<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>
il suffit de supprimer le div avec la classe "checkbox" entourant votre case à cocher et votre étiquette et le problème disparaîtra