2017-03-05 4 views
0

Auf meinem MVC-Ansicht habe ich ein paar Kontrollkästchen:Überprüfen Sie, ob Kontrollkästchen aktiviert ist MVC-Controller

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 
//Other code... 
    <input name="test1" type="checkbox" /> 
    <input name="test2" type="checkbox" /> 
</form> 

auf dem Controller ich mit Get- ein POST die Daten Anfrage- und ich legen Sie sie in die Datenbank:

public void AddRegistered(Registration r) 
{ 
//Other code... 
    dParameters.Add("test1", r.test1.ToString()); 
    dParameters.Add("test2", r.test2.ToString()); 
//Other code... 
} 

Das Problem ist, dass ich einen false Wert erhalten, auch wenn das Kontrollkästchen aktiviert ist.

Wham vermisse ich?

+0

Verwenden Sie 'Html.CheckBoxFor' anstelle von manuellem HTML. – Dai

+0

Es ist eine Voraussetzung, manuelles HTML zu verwenden, ich kann Razor nicht verwenden. – user3378165

+0

Ein checkbox post zurück der Wert seines Steuerelements ist markiert (oder nichts, wenn nicht aktiviert. Ihre Einstellung 'value =" false "' so alles, was es jemals reichen kann ist 'false'.Und wenn Sie nicht die 'HtmlHelper'-Methoden verwenden, dann verwenden Sie nicht mvc, da Sie nie die korrekte Modellbindung erhalten. –

Antwort

1

Als erstes sollten Sie sich die tatsächlichen Daten ansehen, die mit Chrome-Debug-Tools oder ähnlichem an den Server gesendet werden. Was Sie finden könnten, ist, dass Ihr Kontrollkästchenwert auf on gesetzt wird, wenn es aktiviert ist, oder es wird komplett fehlen, wenn es nicht markiert ist.

Ein Vorschlag in den Kommentaren war @Html.CheckBoxFor, aber darunter leidet auch die Tatsache, dass nichts gesendet wird, wenn das Kontrollkästchen deaktiviert ist und in bestimmten Situationen, die immer noch ein Problem werden können.

Sie haben zwei Lösungen - reparieren Sie es auf dem Client oder reparieren Sie es auf dem Server.

Fix es auf dem Client:
Um dies zu tun, müssen Sie (mit Javascript) einem versteckten Feld für jedes Kontrollkästchen hinzuzufügen. Verzeihen Sie mir, ich bin nicht von einem Redakteur um es zu testen, aber es könnte in etwa so aussehen (aus dem Gedächtnis):

$('input[type="checkbox"]').each(function(el) { 
    var hidden = $('<input type="hidden" />'); 
    hidden.name = el.name; 
    el.after(hidden); 
    el.on("change", function(el) { 
     hidden.value = el.checked ? "true" : "false"; 
    }); 
}); 

Fix es auf dem Server:
Um dies zu tun, werden Sie muss eine benutzerdefinierte PropertyBinder erstellen, die on als boolean true erkennt. Dies würde auf einer Eigenschaft-Attribut-Ebene festgelegt werden. Sie könnten alternativ dazu auch die globale ModelBinder überschreiben, damit Sie eine Eigenschaft nicht extra annotieren müssen, damit dies funktioniert.


Ich persönlich ziehe die „repariert es auf dem Client“ Methode, da Sie erhalten entweder true oder false zurück an den Server jedes Mal, das geschrieben ist, was man erwartet und ist in der Nähe von dem Weg dass HtmlHelper es tut.

+0

_Nichts wird gesendet, wenn die Checkbox nicht angekreuzt ist_ ist einfach falsch! - '@ Html.CheckBoxFor()' erzeugt korrekt 2 Eingaben, eine Checkbox mit 'Value =" True "und eine versteckte Eingabe mit' value = "False" ' –

+0

Vielleicht hast du recht, ich kann nicht richtig nachsehen Jetzt - aber ich musste "HtmlHelper" und tun dies manuell vor, weil ich nicht falsche Werte zurück auf den Server gebucht bekommen. Könnte ein separates Problem sein, nicht sicher. – caesay

+0

Danke für die klare Erklärung! – user3378165

0

Sie fehlt das value Attribut:

<input name="test1" type="checkbox" value="true" /> 
<input name="test2" type="checkbox" value="true" /> 

So einfach ist das.

0

Wenn Sie nicht Htmlhelper Klasse verwenden möchten, können Sie dieses tun

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 

<input name="test1" type="checkbox" value="@Model.test1" /> 
<input name="test2" type="checkbox" value="@Model.test2" /> 

test1 und test2 in Ihrer Modellklasse sein sollte.

+0

Sie können tun Sie auch '' - obwohl dies nicht für verschachtelte/untergeordnete Ansichten oder komplexe View-Modelle funktioniert. – Dai

Verwandte Themen