Case à cocher pour accepter les valeurs null boolean
Mon modèle a une valeur booléenne qui doit être nullable
public bool? Foo
{
get;
set;
}
donc, à mon Rasoir cshtml j'ai
@Html.CheckBoxFor(m => m.Foo)
sauf que ça ne marche pas. Ni ne moulage avec (bool). Si je ne
@Html.CheckBoxFor(m => m.Foo.Value)
qui ne crée pas une erreur, mais il ne veut pas se lier à mon modèle quand il est affiché et foo est définie sur null. Quel est le meilleur moyen pour afficher Foo sur la page et de la faire se lier à mon modèle sur un post?
- Voir: stackoverflow.com/questions/2490790/...
- Ce thread ignore la question, que je dois être en mesure de détecter la valeur null comme une 3ème valeur. La soumission d'un formulaire avec la case cochée et la soumission d'un formulaire lorsque la case n'était pas affichés sont deux scénarios différents qui doivent être pris en compte.
Vous devez vous connecter pour publier un commentaire.
Je l'ai eu à travailler avec
et ensuite faire un Booléen.cshtml dans mon EditorTemplates dossier et coller
à l'intérieur.
HasValue
de la propriété, mais pas la réelle valeur de type boolean. Cela permettra de créer un contrôle de case à cocher si, indépendamment de ce que la valeur sous-jacente. Si le nullable a une valeur, il sera toujours vrai.Trouvé réponse à la même question - Le rendu Nullable Bool comme Case.
C'est très simple et fonctionne bien:
C'est comme accepté la réponse de @afinkelstein sauf nous n'avons pas besoin spécial de l'éditeur de template'
J'ai
bool? IsDisabled { get; set; }
dans le Modèle. Inséré si en Vue.Pourquoi? Ce n'est pas logique. Une case à cocher a deux états: cochée/décochée, ou Vrai/Faux, si vous voulez. Il n'y a aucun état tiers.
Ou attendez vous à l'aide de votre domaine de modèles à votre point de vue au lieu d'afficher des modèles? C'est votre problème. Donc la solution pour moi est d'utiliser un modèle d'affichage dans lequel vous allez définir une simple propriété booléenne:
et maintenant, vous aurez votre action de contrôleur passer ce modèle d'affichage de la vue et de générer de la case appropriée.
Compliquant une primitive avec des champs cachés de préciser si False ou Null n'est pas recommandé.
Case à cocher n'est pas ce que vous devriez être en utilisant -- il n'a en fait qu'un état: Vérifié. Sinon, il pourrait être n'importe quoi.
Lorsque votre champ de base de données est un boolean nullable (
bool?
), le UX devez utiliser de 3 Boutons Radio, où le premier bouton représente votre "Checked", le deuxième bouton représente "Non Vérifié" et le troisième bouton représente votre null, quelle que soit la sémantique de null. Vous pouvez utiliser un<select><option>
la liste déroulante enregistrer l'immobilier, mais l'utilisateur doit cliquer deux fois et les choix ne sont pas presque aussi instantanément clair.La RadioButtonList, défini comme une extension nommée RadioButtonForSelectList, s'appuie sur les boutons pour vous, y compris la sélection, la valeur, et définit la
<div class="RBxxxx">
de sorte que vous pouvez utiliser css pour faire de votre radio boutons aller à l'horizontale (display: inline-block), à la verticale, ou dans une table de la mode (display: inline-block; width:100px;)Dans le modèle (je suis l'aide de la chaîne, chaîne pour la définition du dictionnaire comme un exemple pédagogique. Vous pouvez utiliser bool?, string)
Pour moi la solution a été de changer le modèle de vue. Considérez que vous êtes à la recherche pour les factures. Ces factures peuvent être payées ou non. Si votre recherche comporte trois options: Rémunéré, non rémunéré, ou "I don't Care".
J'ai eu ce défini à l'origine comme un booléen? domaine:
Cela m'a fait tomber sur cette question. J'ai créé un type Enum et j'ai manipulé comme suit:
Bien sûr, je les avait enveloppés dans des étiquettes et avait de texte spécifié, je veux seulement dire ici est une autre option à envisager.
Case seulement vous offrir 2 valeurs (vrai, faux). Boolean Nullable a 3 valeurs (true, false, null), donc il est impossible de le faire avec une case à cocher.
Une bonne option est d'utiliser une liste déroulante au lieu.
Modèle
Contrôleur
Vue
Je voudrais créer un modèle pour elle et l'utilisation de ce modèle avec un EditorFor().
Voici comment j'ai fait:
Créer Mon template, qui est essentiellement une vue partielle que j'ai créé dans le EditorTemplates répertoire, sous Partagé, sous le nom de Vues comme (par exemple):
CheckboxTemplate
:L'utiliser comme ceci (à tout point de vue):
@Html.EditorFor(x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
C'est tout.
Modèles sont si puissants dans MVC, les utiliser.. Vous pouvez créer une page entière comme un modèle, que vous utiliseriez avec le
@Html.EditorFor()
à condition que vous vous passer de son modèle de vue de l'expression lambda..Le plus propre de l'approche que je pouvais venir est de développer les extensions disponibles pour
HtmlHelper
tout en encore la réutilisation des fonctionnalités fournies par le framework.J'ai expérimenté avec la 'formation' de l'expression afin de permettre un droit de traverser le natif
CheckBoxFor<Expression<Func<T, bool>>>
mais je ne pense pas que c'est possible.public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
et il a fonctionné à merveille.J'ai eu un problème similaire dans le passé.
Créer une Case à cocher d'entrée en HTML, et de définir l'attribut name="Foo", Ce qui devrait encore afficher correctement.
Seulement de vérifier la valeur null et retourne false pour elle:
J'ai aussi été confronté au même problème. J'ai essayé la méthode suivante pour résoudre le problème
parce que je ne veux pas changer la base de données et générer de l'EDMX.
Lors de la prise de EditorTemplate pour un modèle qui contient un nullable bool...
Diviser le nullable bool en 2 booléens:
Au sein de l'éditeur de modèle:
N'publication de l'origine des biens Foo, parce que c'est maintenant calculé à partir de FooIsNull et FooCheckbox.
Toutes les réponses ci-dessus est venu avec ses propres problèmes. Plus facile et la façon la plus propre de l'OMI est de créer un helper
MVC5 Rasoir
App_Code/Helpers.cshtml
Utilisation
Dans mon scénario, nullable case signifie qu'un membre du personnel n'avait pas encore posé la question pour le client, de sorte qu'il est enveloppé dans un
.checkbox-nullable
de sorte que vous pouvez le style de façon appropriée et d'aider l'utilisateur final à identifier qu'il n'est nitrue
nifalse
CSS
Les méthodes d'Extension:
C'est une vieille question, et les réponses décrivent la plupart des solutions de rechange. Mais il y a une option simple, si vous avez bool? dans votre viewmodel, et vous ne se soucient pas null dans votre INTERFACE utilisateur: