Mon ViewModel a une propriété sélectionnée et sélectionnable. Les deux sont booléens. Je souhaite que ma vue ait une case à cocher activée lorsque la valeur sélectionnable est true et désactivée lorsque la valeur sélectionnable est false. Quelle est la syntaxe de rasoir appropriée pour accomplir cela?
J'ai essayé le code ci-dessous sur une liste d'éléments dans un tableau. Chaque ligne revient avec une case à cocher désactivée indépendamment de la valeur sélectionnable.
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })
Il n’est pas facile d’y parvenir avec une condition if
, à l’intérieur de la méthode d’aide, car toutes les annotations ci-dessous génèreront un chechbox désactivé.
<input type="checkbox" disabled>
<input type="checkbox" disabled="disabled">
<input type="checkbox" disabled="false">
<input type="checkbox" disabled="no">
<input type="checkbox" disabled="enabled">
Cela devrait fonctionner dans le rasoir. Simple si condition et rendu ce que vous voulez.
@if(item.Selected)
{
@Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}
Vous pouvez envisager d'écrire un utilitaire HTML personnalisé qui rend le balisage approprié pour cela.
Cela ne fonctionnera pas parce que <input disabled="anything" />
entraînera un contrôle désactivé. Vous devez uniquement posséder une propriété @disabled lorsqu'elle doit être désactivée.
Essayez quelque chose comme ça:
@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ? (object)new {} : (object)new { @disabled = "disabled" })
Notez que vous devrez peut-être transtyper en (object)
Désolé, ma réponse précédente était fausse.
L'élément input sera désactivé dès que l'attribut sera désactivé. Peu importe si la valeur est vraie, fausse. En HTML, vous ne pouvez pas définir désactivé sur false.
Vous devrez donc définir l'attribut disabled uniquement lorsque la condition est valide.
quelque chose comme:
object attributes = null;
if (!item.Selectable)
{
attributes = new { disabled = "disabled"};
}
@Html.CheckBoxFor(modelItem => item.Selected, attributes)
Le problème est que vous devez ajouter plus d'un attribut HTML. C'est un gâchis:
@if(item.Selected)
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar"})
}
else
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar", @disabled = "disabled"})
}
Ce que je fais pour résoudre ceci est d'utiliser un IDictionary<string, object>
qui est précédemment chargé:
var htmlAttributes = new Dictionary<string, object>{
{"data-foo", "bar"}
};
if(!item.Selected)
{
htmlAttributes.Add("@disabled", "disabled");
}
Et puis je crée le composant case à cocher une seule fois:
@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)