Asp .net mvc 3 CheckBoxFür die Methode "hidden field" (verborgenes Feld ausgeben) ist der Wert des ausgeblendeten Felds false, wenn das Kontrollkästchen mit "true" deaktiviert ist

8

CheckBoxFor (t = & gt; t.boolValue, neu {disabled="disabled"}) Methode zum Rendern eines Kontrollkästchens im deaktivierten Modus.

Die Methode rendert auch ein verstecktes Feld.

Meine Frage ist, warum hat dieses versteckte Feld einen falschen Wert für das deaktivierte Kontrollkästchen? Ich glaube, der Zweck des versteckten Feldes besteht darin, ein zusätzliches Verhalten gegenüber dem Standard-Kontrollkästchenverhalten zu haben.

Gibt es eine Möglichkeit, die Standard-MVC-Funktionalität zu überschreiben, so dass der Wert dieses ausgeblendeten Feldes angezeigt wird basiert auf dem Status des Kontrollkästchens auch im deaktivierten Modus?

    
Shameet 13.06.2012, 08:50
quelle

4 Antworten

14

Das versteckte Feld wird verwendet, um den Checkbox-Wert an eine boolesche Eigenschaft zu binden. Die Sache ist, dass, wenn ein Kontrollkästchen nicht aktiviert ist, nichts an den Server gesendet wird, sodass ASP.NET MVC dieses versteckte Feld verwendet, um false zu senden und an das entsprechende boolesche Feld zu binden. Sie können dieses Verhalten nicht anders als das Schreiben eines benutzerdefinierten Helpers ändern.

Dies gesagt, anstelle von disabled="disabled" verwenden Sie readonly="readonly" auf das Kontrollkästchen. Auf diese Weise behalten Sie das gleiche gewünschte Verhalten bei, dass der Benutzer seinen Wert nicht ändern kann, aber zusätzlich wird der Wert an den Server gesendet, wenn das Formular gesendet wird:

%Vor%

UPDATE:

Wie in den Kommentaren erwähnt, funktioniert das readonly -Attribut nicht mit Google Chrome. Eine weitere Möglichkeit besteht darin, ein weiteres verstecktes Feld zu verwenden und das Kontrollkästchen zu deaktivieren:

%Vor%

UPDATE 2:

Hier ist ein vollständiger Testfall mit dem zusätzlichen versteckten Feld.

Modell:

%Vor%

Controller:

%Vor%

Anzeigen:

%Vor%

Wenn das Formular gesendet wird, ist der Wert der Foo-Eigenschaft true . Ich habe mit allen gängigen Browsern (Chrome, FF, IE) getestet.

    
Darin Dimitrov 13.06.2012, 08:53
quelle
3

Ich finde, dass der hinzugefügte Parameter in der Query-Zeichenfolge ein Durcheinander verursacht und Leute denken lässt, dass wir als Entwickler etwas falsch gemacht haben. Also habe ich auf die extreme Methode zurückgegriffen, meine eigene InputExtensions-Klasse zu erstellen, die es mir ermöglicht, zu entscheiden, ob die versteckte Eingabe gerendert werden soll oder nicht.

Im Folgenden ist die InputExtensions-Klasse, die ich erstellt habe (basierend auf dem vorhandenen MVC-Code, um volle Kompatibilität zu erhalten):

%Vor%

Dann können Sie die Methode wie folgt aufrufen:

%Vor%     
Bonner 웃 07.07.2015 09:20
quelle
2

Hier ist ein kurzer Tipp, den ich entdeckt habe: Wenn Sie einen Standardwert für den booleschen Wert für das Objekt festlegen. Es ist möglich, das Tag mit dem Wert als true / false auszugeben (dieser Wert sollte das Gegenteil des booleschen Standardwerts für das Objekt sein)

%Vor%

Der Wert wird nur gesendet, wenn das Kontrollkästchen aktiviert ist, also funktioniert es.

    
Daniel Mudge 19.11.2012 00:39
quelle
0

Obwohl Darins Antwort völlig in Ordnung ist, gibt es eine andere Möglichkeit, sicherzustellen, dass das deaktivierte Kontrollkästchen wie erwartet zurückgeschrieben wird.

Diese Lösung funktioniert auch in den Szenarios, in denen das Kontrollkästchen abhängig von einer Eigenschaft in einem Modell oder basierend auf der Benutzerauswahl oder clientseitig abgerufenen Daten deaktiviert / aktiviert ist.

Sie können Ihre Ansicht einfach halten: (Einstellung hier deaktiviert ist optional)

%Vor%

Dies wird, wie von Darin erwähnt, ein zusätzliches verstecktes Eingabefeld erzeugen, das auf "false" gesetzt ist, so dass der Checkbox-Wert auch dann zurückgeschrieben wird, wenn das Kontrollkästchen nicht aktiviert ist. Daher wissen wir, dass das Feld Something immer zurückgibt, unabhängig davon, ob das Kontrollkästchen aktiviert ist oder nicht, ob es deaktiviert ist oder nicht. Das einzige Problem, wenn das Kontrollkästchen deaktiviert ist, wird immer als False zurückgemeldet.

Wir können das mit einer javascript-Nachbearbeitung vor dem Senden beheben. In meinem Fall sieht der Code in etwa so aus:

%Vor%

Sie müssen es möglicherweise für Ihr Szenario ändern, aber Sie sollten die Idee bekommen.

    
Sebastian K 21.03.2013 20:49
quelle

Tags und Links