MVC map to nullable bool dans le modèle
Avec un modèle d'affichage contenant le champ:
public bool? IsDefault { get; set; }
J'obtiens une erreur lors de la tentative de carte dans la vue:
<%= Html.CheckBoxFor(model => model.IsDefault) %>
Impossible de convertir implicitement le type 'bool?' à 'bool'. Une conversion explicite existe (vous manque un plâtre?)
J'ai essayé de la coulée, et à l'aide de .Value
et ni travaillé.
Remarque le comportement que je voudrais, c'est que le fait de soumettre le formulaire doit définir IsDefault
dans le modèle à true ou false. Une valeur de null
signifie simplement que le modèle n'a pas été renseigné.
source d'informationauteur fearofawhackplanet
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous avez vraiment trois valeurs possibles; true, false et null, donc, le CheckBoxFor ne peut pas gérer les trois états (deux états).
Brad Wilson, explique sur son blog ici. Il utilise un DropDownList pour nullable booléens.
Ce StackOverflow question fait un bien meilleur travail de description de la situation que j'ai fait ci-dessus. L'inconvénient de la solution est parfois nullable n'implique pas faux, il convient de prendre la valeur null. Un exemple de ceci serait critères de filtre où vous ne voulez pas de vrai ou de faux appliquée.
Si vous n'avez pas de soins sur la valeur null, et vous voulez juste la case à cochée lorsque sa valeur est null, vous pouvez effectuer les opérations suivantes:
Créer une autre propriété de type bool dans votre Modèle comme ceci:
Puis il suffit de l'utiliser pour la liaison...
Pour moi, c'est beaucoup mieux:
Voici comment mapper un bullable boolean
bool?
propriété dans unDropDownListFor
:Et voici comment l'associer à un
CheckBoxFor
à l'aide d'un non nullable proxy propriété comme une solution de contournement:Dans le ViewModel:
Dans la Vue:
Le seul inconvénient de cette solution est que le
null
valeur est traitée commefalse
: si vous ne pouvez pas l'accepter, il est préférable d'utiliser un contrôle qui peut soutenir des trois états, comme dans l'exemple susmentionnéDropDownListFor
.Pour plus d'info, lire ici.
À ajouter à vapcguy réponse, l'autre, plus "propre" façon de le faire est comme suit
Ou
Vous pouvez créer un éditeur de modèle pour le rendu d'une case à cocher pour accepter les valeurs null des Booléens. Nom du modèle Booléen.cshtml de l'utiliser comme valeur par défaut pour toutes les propriétés Booléennes à l'intérieur du site. S'assurer que le fichier est dans le dossier ~/Views/Shared/EditorTemplates