Mein Modell hat einen Booleschen Wert, der nullwertfähig sein muss
public bool? Foo
{
get;
set;
}
also in meinem Razor cshtml habe ich
@Html.CheckBoxFor(m => m.Foo)
außer das funktioniert nicht. Es wird auch nicht mit (bool) gecastet. Wenn ich mache
@Html.CheckBoxFor(m => m.Foo.Value)
Das erzeugt keinen Fehler, bindet aber nicht an mein Modell, wenn es veröffentlicht wird, und foo wird auf null gesetzt. Was ist der beste Weg, um Foo auf der Seite anzuzeigen und es in einem Beitrag an mein Modell zu binden?
asp.net-mvc-3
razor
nullable
DMulligan
quelle
quelle
Antworten:
Ich habe es zum Arbeiten
und dann eine Boolean.cshtml in meinem EditorTemplates-Ordner erstellen und bleiben
Innerhalb.
quelle
HasValue
Eigenschaft, jedoch nicht für den tatsächlichen booleschen Wert. Dadurch wird ein Kontrollkästchen erstellt, unabhängig vom zugrunde liegenden Wert. Wenn die Nullable einen Wert hat, ist dies immer wahr.Antwort in ähnlicher Frage gefunden - Nullable Bool als CheckBox rendern . Es ist sehr einfach und funktioniert einfach:
Es ist wie eine akzeptierte Antwort von @afinkelstein, außer dass wir keine spezielle 'Editor-Vorlage' benötigen.
quelle
Ich habe
bool? IsDisabled { get; set; }
in Model. Eingefügt, wenn in Ansicht.quelle
Warum? Das macht keinen Sinn. Ein Kontrollkästchen hat zwei Status: Aktiviert / Deaktiviert oder Richtig / Falsch, wenn Sie so wollen. Es gibt keinen dritten Zustand.
Oder warten Sie, bis Sie Ihre Domain-Modelle in Ihren Ansichten anstelle von Ansichtsmodellen verwenden? Das ist dein Problem. Die Lösung für mich besteht also darin, ein Ansichtsmodell zu verwenden, in dem Sie eine einfache boolesche Eigenschaft definieren:
Jetzt muss Ihre Controller-Aktion dieses Ansichtsmodell an die Ansicht übergeben und das richtige Kontrollkästchen generieren.
quelle
Komplizieren eines Grundelements mit ausgeblendeten Feldern, um zu klären, ob False oder Null nicht empfohlen wird.
Das Kontrollkästchen ist nicht das, was Sie verwenden sollten - es hat wirklich nur einen Status: Aktiviert . Sonst könnte es alles sein.
Wenn Ihr Datenbankfeld ein nullfähiger Boolescher Wert (
bool?
) ist, sollte die UX 3 Optionsfelder verwenden, wobei die erste Schaltfläche Ihr "Aktiviert" darstellt, die zweite Schaltfläche "Nicht überprüft" und die dritte Schaltfläche Ihre Null darstellt, unabhängig von der Semantik null bedeutet. Sie können eine<select><option>
Dropdown-Liste verwenden, um Immobilien zu speichern, aber der Benutzer muss zweimal klicken und die Auswahlmöglichkeiten sind bei weitem nicht so augenblicklich klar.Die RadioButtonList, definiert als Erweiterung mit dem Namen RadioButtonForSelectList, erstellt die Optionsfelder für Sie, einschließlich des ausgewählten / aktivierten Werts, und legt die fest
<div class="RBxxxx">
dass Sie mithilfe von CSS Ihre Optionsfelder horizontal (Anzeige: Inline-Block), vertikal oder vertikal schalten können in einer Tabellenform (Anzeige: Inline-Block; Breite: 100px;)Im Modell (ich verwende Zeichenfolge, Zeichenfolge für die Wörterbuchdefinition als pädagogisches Beispiel. Sie können bool?, Zeichenfolge verwenden)
quelle
Für mich bestand die Lösung darin, das Ansichtsmodell zu ändern. Stellen Sie sich vor, Sie suchen nach Rechnungen. Diese Rechnungen können bezahlt werden oder nicht. Ihre Suche hat also drei Optionen: Bezahlt, Unbezahlt oder "Es ist mir egal".
Ich hatte das ursprünglich als Bool eingestellt? Feld:
Dies brachte mich dazu, über diese Frage zu stolpern. Am Ende habe ich einen Aufzählungstyp erstellt und dies wie folgt behandelt:
Natürlich hatte ich sie in Etiketten eingewickelt und Text angegeben. Ich meine, hier ist eine weitere Option, die ich in Betracht ziehen sollte.
quelle
Das Kontrollkästchen bietet nur 2 Werte (wahr, falsch). Nullable Boolean hat 3 Werte (true, false, null), daher ist es unmöglich, dies mit einem Kontrollkästchen zu tun.
Eine gute Option ist die Verwendung eines Dropdowns.
Modell
Regler
Aussicht
quelle
Ich würde tatsächlich eine Vorlage dafür erstellen und diese Vorlage mit einem EditorFor () verwenden.
So habe ich es gemacht:
Meine Vorlage erstellen, bei der es sich im Grunde um eine Teilansicht handelt, die ich im EditorTemplates-Verzeichnis unter "Freigegeben" unter "Ansichten" als (zum Beispiel) :: erstellt habe
CheckboxTemplate
:Verwenden Sie es so (in jeder Ansicht):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
Das ist alles.
Vorlagen sind in MVC so leistungsfähig, verwenden Sie sie. Sie können eine ganze Seite als Vorlage erstellen, die Sie mit dem verwenden würden
@Html.EditorFor()
. vorausgesetzt, Sie übergeben das Ansichtsmodell im Lambda-Ausdruck.quelle
Der sauberste Ansatz, den ich finden könnte, besteht darin, die verfügbaren Erweiterungen zu erweitern und
HtmlHelper
gleichzeitig die vom Framework bereitgestellten Funktionen wiederzuverwenden.Ich habe versucht, den Ausdruck so zu formen, dass ein direkter Durchgang zum Eingeborenen möglich ist,
CheckBoxFor<Expression<Func<T, bool>>>
aber ich denke nicht, dass dies möglich ist.quelle
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
und es hat wunderbar funktioniert.Ich hatte in der Vergangenheit ein ähnliches Problem.
Erstellen Sie eine Checkbox-Eingabe in HTML und setzen Sie das Attribut name = "Foo". Dies sollte weiterhin ordnungsgemäß veröffentlicht werden.
quelle
Überprüfen Sie einfach den Nullwert und geben Sie false zurück:
quelle
Ich stand auch vor dem gleichen Problem. Ich habe den folgenden Ansatz versucht, um das Problem zu lösen, da ich die Datenbank nicht ändern und den EDMX erneut generieren möchte.
quelle
Wenn Sie eine EditorTemplate für ein Modell erstellen, das einen nullbaren Bool enthält ...
Teilen Sie den nullbaren Bool in zwei Boolesche Werte auf:
Innerhalb der Editorvorlage:
Postbacken Sie nicht die ursprüngliche Eigenschaft Foo, da diese jetzt aus FooIsNull und FooCheckbox berechnet wird.
quelle
Alle oben genannten Antworten hatten ihre eigenen Probleme. Der einfachste / sauberste Weg IMO ist es, einen Helfer zu erstellen
MVC5 Rasiermesser
App_Code / Helpers.cshtml
Verwendung
In meinem Szenario bedeutet ein nullbares Kontrollkästchen, dass ein Mitarbeiter dem Kunden die Frage noch nicht gestellt hat. Sie ist daher in ein Kontrollkästchen eingeschlossen, damit Sie den
.checkbox-nullable
Stil entsprechend gestalten und dem Endbenutzer helfen können, zu erkennen, dass es wedertrue
noch istfalse
CSS
quelle
Erweiterungsmethoden:
quelle
Optionsfelder sind nützlich, aber Sie können die Auswahl nicht aufheben . Wenn Sie dieses Verhalten wünschen, sollten Sie ein Dropdown-Menü verwenden. Der folgende Code generiert das
SelectList
und bindet erfolgreich an einen nullbaren Booleschen Wert:quelle
quelle
Sie können so versuchen
quelle
Dies ist eine alte Frage, und die vorhandenen Antworten beschreiben die meisten Alternativen. Aber es gibt eine einfache Option, wenn Sie Bool haben? in Ihrem Ansichtsmodell, und Sie interessieren sich nicht für null in Ihrer Benutzeroberfläche:
quelle