Mon modèle a un booléen qui doit être nullable
public bool? Foo
{
get;
set;
}
donc dans mon Razor cshtml j'ai
@Html.CheckBoxFor(m => m.Foo)
sauf que ça ne marche pas. Ni le cast avec (bool). Si je fais
@Html.CheckBoxFor(m => m.Foo.Value)
cela ne crée pas d'erreur, mais il ne se lie pas à mon modèle lorsqu'il est publié et foo est défini sur null. Quelle est la meilleure façon d'afficher Foo sur la page et de la lier à mon modèle sur une publication?
asp.net-mvc-3
razor
nullable
DMulligan
la source
la source
Réponses:
Je dois travailler avec
puis créer un Boolean.cshtml dans mon dossier EditorTemplates et coller
à l'intérieur.
la source
HasValue
propriété Nullable , mais pas la valeur booléenne réelle. Cela créera une case à cocher si quelle que soit la valeur sous-jacente. Si le nullable a une valeur, ce sera toujours vrai.Réponse trouvée dans une question similaire - Rendu Nullable Bool comme CheckBox . C'est très simple et fonctionne simplement:
C'est comme une réponse acceptée de @afinkelstein sauf que nous n'avons pas besoin de 'modèle d'éditeur' spécial
la source
J'ai
bool? IsDisabled { get; set; }
dans Model. Inséré si dans View.la source
Pourquoi? Cela n'a pas de sens. Une case à cocher a deux états: coché / décoché ou Vrai / Faux si vous voulez. Il n'y a pas de troisième état.
Ou attendez que vous utilisiez vos modèles de domaine dans vos vues au lieu de voir des modèles? C'est ton problème. La solution pour moi est donc d'utiliser un modèle de vue dans lequel vous définirez une simple propriété booléenne:
et maintenant, l'action de votre contrôleur passera ce modèle de vue à la vue et générera la case à cocher appropriée.
la source
Compliquer une primitive avec des champs masqués pour clarifier si False ou Null n'est pas recommandé.
La case à cocher n'est pas ce que vous devriez utiliser - elle n'a en réalité qu'un seul état: cochée . Sinon, ça pourrait être n'importe quoi.
Lorsque votre champ de base de données est un booléen Nullable (
bool?
), l'UX doit utiliser 3-Radio Buttons, où le premier bouton représente votre "Checked", le deuxième bouton représente "Not Checked" et le troisième bouton représente votre null, quelle que soit la sémantique de null signifie. Vous pouvez utiliser une<select><option>
liste déroulante pour enregistrer des biens immobiliers, mais l'utilisateur doit cliquer deux fois et les choix ne sont pas aussi clairs instantanément.La RadioButtonList, définie comme une extension nommée RadioButtonForSelectList, crée les boutons radio pour vous, y compris la valeur sélectionnée / cochée, et définit le
<div class="RBxxxx">
afin que vous puissiez utiliser css pour rendre vos boutons radio horizontaux (affichage: bloc en ligne), vertical ou sous forme de tableau (affichage: bloc en ligne; largeur: 100px;)Dans le modèle (j'utilise string, string pour la définition du dictionnaire comme exemple pédagogique. Vous pouvez utiliser bool ?, string)
la source
Pour moi, la solution était de changer le modèle de vue. Considérez que vous recherchez des factures. Ces factures peuvent être payées ou non. Votre recherche comporte donc trois options: Payé, Non payé ou "Je m'en fiche".
Je l'avais initialement défini comme un booléen? champ:
Cela m'a fait trébucher sur cette question. J'ai fini par créer un type Enum et j'ai géré cela comme suit:
Bien sûr, je les avais enveloppés dans des étiquettes et j'avais spécifié du texte, je veux simplement dire que voici une autre option à considérer.
la source
La case à cocher ne vous propose que 2 valeurs (vrai, faux). Nullable boolean a 3 valeurs (true, false, null) donc il est impossible de le faire avec une case à cocher.
Une bonne option consiste à utiliser une liste déroulante à la place.
Modèle
Manette
Vue
la source
Je créerais en fait un modèle pour cela et utiliserais ce modèle avec un EditorFor ().
Voici comment je l'ai fait:
Créer mon modèle, qui est essentiellement une vue partielle que j'ai créée dans le répertoire EditorTemplates, sous Shared, sous Views, nommez-le comme (par exemple)
CheckboxTemplate
::Utilisez-le comme ceci (dans n'importe quelle vue):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
C'est tout.
Les modèles sont si puissants dans MVC, utilisez-les .. Vous pouvez créer une page entière en tant que modèle, que vous utiliseriez avec le
@Html.EditorFor()
; à condition que vous passiez son modèle de vue dans l'expression lambda.la source
L'approche la plus propre que je pourrais proposer est d'étendre les extensions disponibles
HtmlHelper
tout en réutilisant les fonctionnalités fournies par le framework.J'ai essayé de «façonner» l'expression pour permettre un passage direct au natif
CheckBoxFor<Expression<Func<T, bool>>>
mais je ne pense pas que ce soit possible.la source
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
et cela a fonctionné à merveille.J'ai eu un problème similaire dans le passé.
Créez une entrée de case à cocher en HTML et définissez l'attribut name = "Foo". Cela devrait toujours s'afficher correctement.
la source
Vérifiez simplement la valeur nulle et renvoyez-lui false:
la source
J'ai également fait face au même problème. J'ai essayé l'approche suivante pour résoudre le problème car je ne veux pas changer la base de données et générer à nouveau l'EDMX.
la source
Lors de la création d'un EditorTemplate pour un modèle contenant un bool Nullable ...
Divisez le bool nullable en 2 booléens:
Dans le modèle de l'éditeur:
Ne publiez pas la propriété d'origine Foo, car elle est désormais calculée à partir de FooIsNull et FooCheckbox.
la source
Toutes les réponses ci-dessus sont venues avec ses propres problèmes. Le moyen le plus simple / le plus propre à l'OMI est de créer un assistant
Rasoir MVC5
App_Code / Helpers.cshtml
Usage
Dans mon scénario, une case à cocher nullable signifie qu'un membre du personnel n'avait pas encore posé la question au client, elle est donc enveloppée dans un
.checkbox-nullable
afin que vous puissiez styler de manière appropriée et aider l'utilisateur final à identifier que ce n'est nitrue
nifalse
CSS
la source
Méthodes d'extension:
la source
Les boutons radio sont utiles, mais ils ne vous permettent pas de désélectionner . Si vous voulez ce comportement, envisagez d'utiliser une liste déroulante / sélectionnez. Le code suivant générera le
SelectList
et cela se lie avec succès à un booléen Nullable:la source
la source
tu peux essayer comme ça
la source
C'est une vieille question, et les réponses existantes décrivent la plupart des alternatives. Mais il y a une option simple, si vous avez booléen? dans votre viewmodel, et vous ne vous souciez pas de null dans votre interface utilisateur:
la source