Mir ist gerade aufgefallen, dass Html.CheckBox("foo")
2 Eingänge anstelle von einem generiert werden. Weiß jemand, warum das so ist?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
asp.net-mvc
Omu
quelle
quelle
Antworten:
Wenn das Kontrollkästchen nicht aktiviert ist, wird das Formularfeld nicht gesendet. Deshalb gibt es im versteckten Feld immer einen falschen Wert. Wenn Sie das Kontrollkästchen nicht aktivieren, hat das Formular weiterhin einen Wert aus dem ausgeblendeten Feld. Auf diese Weise verarbeitet ASP.NET MVC Kontrollkästchenwerte.
Wenn Sie dies bestätigen möchten, aktivieren Sie das Kontrollkästchen nicht mit Html.Hidden, sondern mit
<input type="checkbox" name="MyTestCheckboxValue"></input>
. Lassen Sie das Kontrollkästchen deaktiviert, senden Sie das Formular und sehen Sie sich die auf der Serverseite veröffentlichten Anforderungswerte an. Sie werden sehen, dass es keinen Kontrollkästchenwert gibt. Wenn Sie ein verstecktes Feld hätten, würde es einenMyTestCheckboxValue
Eintrag mitfalse
Wert enthalten.quelle
IsActive
, dietrue
im Konstruktor initiiert wird . Das Kontrollkästchen des Benutzers wird deaktiviert. Da der Wert jedoch nicht an den Server gesendet wird, wird er vom Modellordner nicht übernommen und der Eigenschaftswert wird nicht geändert. Der Modellordner sollte nicht davon ausgehen, dass der Wert, wenn er nicht gesendet wird, auf false gesetzt wurde, da Sie möglicherweise entscheiden, diesen Wert nicht zu senden.false
Werte, auch wenn sie aktiviert sind, und das ist verwirrend. Deaktivierte Kontrollkästchen sollten überhaupt keinen Wert senden, wenn ASP.NET mit dem Standard-HTTP-Verhalten kompatibel sein soll.Sie können einen Helfer schreiben, um das Hinzufügen der versteckten Eingabe zu verhindern:
benutze es:
quelle
@using Your.Name.Space
oben in Ihrer .cshtml-Rasiermesser-Ansichtsdatei hinzuzufügen .System.Web.Mvc.Html
, um in allen Ansichten zugänglich zu seinWenn das Kontrollkästchen aktiviert und gesendet ist, führen Sie dies aus
Verweisen
quelle
Der manuelle Ansatz ist folgender:
quelle
Dies ist die stark typisierte Version von Alexander Trofimovs Lösung:
quelle
Verwenden Sie Enthält, es funktioniert mit den zwei möglichen Post-Werten: "false" oder "true, false".
quelle
Die versteckte Eingabe verursachte Probleme mit gestalteten Kontrollkästchen. Also habe ich eine HTML-Hilfserweiterung erstellt, um die versteckte Eingabe außerhalb des Divs mit der CheckBox zu platzieren.
Ergebnis
quelle
Dies ist kein Fehler! Es wird die Möglichkeit hinzugefügt, nach dem Posten des Formulars auf dem Server immer einen Wert zu haben. Wenn Sie mit jQuery Eingabefelder für Kontrollkästchen bearbeiten möchten, verwenden Sie die Methode prop (übergeben Sie die Eigenschaft 'checked' als Parameter). Beispiel:
$('#id').prop('checked')
quelle
Sie können versuchen, den Konstruktor Ihres Modells folgendermaßen zu initialisieren:
und aus Ihrer Sicht:
quelle
Ich fand, dass dies wirklich Probleme verursachte, als ich ein WebGrid hatte. Die Sortierlinks im WebGrid werden durch den verdoppelten Querystring oder x = true & x = false in x = true, false umgewandelt und verursachen einen Analysefehler im Kontrollkästchen für.
Am Ende habe ich jQuery verwendet, um die versteckten Felder auf der Clientseite zu löschen:
quelle