Ich arbeite an einer ASP.NET MVC 4-App. Diese App hat eine Grundform. Das Modell für mein Formular sieht folgendermaßen aus:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
In meinem Formular habe ich den folgenden HTML-Code.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Wenn ich das Formular poste, ist der Wert "Merken" im Modell immer falsch. Die Name-Eigenschaft im Modell hat jedoch einen Wert. Ich habe dies getestet, indem ich im Folgenden einen Haltepunkt festgelegt habe:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Ich kann es nicht herausfinden. Warum wird der Checkbox-Wert nicht gesetzt?
c#
asp.net-mvc-4
JQuery Mobile
quelle
quelle
Antworten:
Wird generieren:
Wie funktioniert es:
checkbox
Kontrollkästchen nicht aktiviert ist, sendet das Formular nur denhidden
Wert (false).true
für das Modell derbool
Eigenschaft<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Dies sendet immer den Standardwert, wenn aktiviert.
quelle
Da Sie Model.Name verwenden, um den Wert festzulegen. Ich gehe davon aus, dass Sie ein leeres Ansichtsmodell an die Ansicht übergeben.
Der Wert für Remember ist also false und setzt den Wert für das Kontrollkästchenelement auf false. Dies bedeutet, dass Sie beim Aktivieren des Kontrollkästchens den Wert "false" im Formular veröffentlichen. Wenn Sie es nicht auswählen, wird es nicht veröffentlicht, sodass das Modell standardmäßig false ist. Aus diesem Grund wird in beiden Fällen ein falscher Wert angezeigt.
Der Wert wird nur übergeben, wenn Sie das Auswahlfeld aktivieren. Um ein Kontrollkästchen in Mvc zu aktivieren, verwenden Sie
oder wenn Sie das Modell nicht an die Ansicht binden möchten.
Mvc zaubert mit einem versteckten Feld, um Werte beizubehalten, wenn sie nicht ausgewählt sind.
Bearbeiten, wenn Sie wirklich eine Abneigung dagegen haben und das Element selbst generieren möchten, können Sie dies tun.
quelle
@Html.CheckboxFor
Code sollte eigentlich sein@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
ein Optionsfeld verwenden? oder ist das nicht möglichtype="radio"
, und die Auswahl des gewünschten HTML-Codes im HTML-Code ist dieselbe wie obenchecked="checked"
. Der Unterschied besteht darin, dass Sie mehrere<input />
Elemente mit demselben Namen haben. Sie müssen herausfinden, auf welche davon Sie den zusätzlichen HTML-Code anwenden möchten.@Html.CheckBoxFor(x => x.Remember)
das hat bei mirVerwenden Sie nur dies
quelle
$(this).val($(this).is(":checked"));
Anstatt
verwenden:
Dadurch erhalten Sie ein Kontrollkästchen speziell für Remember
quelle
Okay, das Kontrollkästchen ist ein bisschen komisch. Wenn Sie den HTML-Helfer verwenden, werden zwei Markierungen für das Markup generiert, und beide werden als Name-Wert-Paar von IEnumerable übergeben, wenn diese Option aktiviert ist.
Wenn es im Markup nicht aktiviert ist, wird es nur in der versteckten Eingabe übergeben, die den Wert false hat.
So haben Sie zum Beispiel auf dem Markup:
Und in der Controller-Aktion (stellen Sie sicher, dass der Name mit dem Kontrollkästchen-Parameternamen auf dem Controller übereinstimmt):
Dann können Sie im Controller einige Dinge tun wie:
Ich weiß, dass dies keine elegante Lösung ist. Hoffe, jemand hier kann einige Hinweise geben.
quelle
Um einen von einem Kontrollkästchen in einem Formular zurückgegebenen Wert in eine boolesche Eigenschaft zu konvertieren, habe ich den In-Build-Konverter von ValueProviderResult in einem benutzerdefinierten ModelBinder verwendet.
quelle
Wenn Sie mit FormCollection anstatt mit model arbeiten, kann die Zuweisung so einfach sein wie:
quelle
Ich bin auf ein ähnliches Problem gestoßen und konnte den Wert des Kontrollkästchens mithilfe eines Kontrollkästchens, versteckt für und kleiner JQuery wie folgt, zurückerhalten:
quelle
Dies war ein großer Schmerz und scheint einfacher zu sein. Hier ist mein Setup und meine Lösung.
Ich verwende den folgenden HTML-Helfer:
@Html.CheckBoxFor(model => model.ActiveFlag)
Dann überprüfe ich im Controller die Formularerfassung und -verarbeitung entsprechend:
quelle
user.IsActive = fc["IsActive"] != "false";
ich mich immer noch schmutzig fühle, wenn ich einen String-Vergleich daran mache.Ich bin gerade darauf gestoßen (ich kann nicht glauben, dass es nicht ein- und ausgeschaltet wird!)
Sowieso!
Gibt einen Wert von "ein" oder "aus" aus.
Dies wird NICHT an einen Booleschen Wert gebunden , aber Sie können diese dumme Problemumgehung durchführen!
quelle
quelle
Für die MVC mit Model. Modell:
HTML:
In der Funktion [HttpPost] können wir ihre Eigenschaften abrufen.
quelle
Wenn Sie wirklich einfaches HTML (aus welchem Grund auch immer) und nicht die integrierten HtmlHelper-Erweiterungen verwenden möchten, können Sie dies auf diese Weise tun.
Anstatt
versuchen Sie es mit
Checkbox-Eingaben in HTML funktionieren so, dass sie beim Aktivieren den Wert senden und wenn sie nicht aktiviert sind, überhaupt nichts senden (was dazu führt, dass ASP.NET MVC auf den Standardwert von zurückfällt Feld,
false
). Der Wert des Kontrollkästchens in HTML kann auch alles sein, was nicht nur wahr / falsch ist. Wenn Sie es also wirklich wollten, können Sie sogar ein Kontrollkästchen für ein Zeichenfolgenfeld in Ihrem Modell verwenden.Wenn Sie das integrierte
Html.RenderCheckbox
Kontrollkästchen verwenden, werden tatsächlich zwei Eingaben ausgegeben: das Kontrollkästchen und ein ausgeblendetes Feld, sodass ein falscher Wert gesendet wird, wenn das Kontrollkästchen deaktiviert ist (nicht nur nichts). Dies kann zu unerwarteten Situationen führen:quelle
Für mehrere Kontrollkästchen mit demselben Namen ... Code zum Entfernen unnötiger Fehler:
Funktion
Benutze es :
quelle
quelle
Ändern Denken Sie daran
Verwenden Sie nullable bool in controller und fallback to false on null wie folgt
quelle
In meinem Fall habe ich die Modelleigenschaft "Remember" in der get-Methode nicht festgelegt. Überprüfen Sie Ihre Logik in der Steuerung. Sie können das gleiche tun. Ich hoffe diese Hilfe!
quelle
Ich habe die anderen Antworten durchgelesen und es nicht ganz zum Laufen gebracht - hier ist die Lösung, mit der ich am Ende fertig war.
Mein Formular verwendet das
Html.EditorFor(e => e.Property)
, um das Kontrollkästchen zu generieren, und bei VerwendungFormCollection
in der Steuerung wird ein Zeichenfolgenwert von'true,false'
in der Steuerung übergeben.Wenn ich die Ergebnisse verarbeite, verwende ich eine Schleife, um sie zu durchlaufen. Außerdem verwende ich eine
InfoProperty
Instanz, um den aktuellen Modellwert darzustellen, der anhand des Formulars bewertet wird.Stattdessen überprüfe ich einfach, ob die zurückgegebene Zeichenfolge mit dem Wort beginnt,
'true'
setze dann eine boolesche Variable auftrue
und übergebe diese an das Rückgabemodell.quelle