Ich habe eine Klasse namens "PropertyFeature", die einfach PropertyFeatureID und Description enthält. Es ist ein ordnungsgemäßes Modell, das über LINQ to SQL erstellt wurde, das einer SQL Server-Datenbanktabelle zugeordnet ist. Eine Beispielinstanz / -zeile wäre:
%Vor%Die Anzahl der Zeilen (PropertyFeatures) kann natürlich vergrößert und verkleinert werden. Daher möchte ich eine Liste mit Kontrollkästchen dynamisch so rendern, dass der Benutzer sie auswählen kann. Ich kann die Checkboxen sehr einfach dynamisch darstellen, etwa mit:
%Vor%Ich gebe die ID für jedes Kontrollkästchen an und rendere das passende Label, damit der Benutzer intuitiv auf das Label klicken und das Kontrollkästchen aktivieren kann - das funktioniert großartig.
Ich setze den "Namen" der CheckBox auf "Features", so dass alle Checkboxen mit dem gleichen Namen rendern, und der MVC Model Binder stapelt sie in eine einzelne Sammlung namens "Features", wenn das Formular gepostet wird. Das funktioniert gut.
Sobald das Formular abgeschickt ist, verwende ich die überprüften Werte und speichere sie, also brauche ich die tatsächlichen Integer-Werte, damit ich weiß, welches PropertyFeature ausgewählt ist, nicht nur ein Stapel von Booleschen und Feldnamen. Im Idealfall möchte ich es als ein Array oder eine Sammlung, mit der einfach zu arbeiten ist.
Ich kann die ausgewählten Werte aus meiner Controller-Methode abrufen, wenn auf die Schaltfläche geklickt wird, weil ich den Parameter als int [] Features angegeben habe.
Aber das Problem ist, dass es den Zustand nicht aufrechterhält. Das heißt, wenn ich auf den Absenden-Button klicke und die Seite neu lade (wobei das Formular erneut angezeigt wird), möchte ich, dass alle dynamischen Checkboxen ihren aktivierten Status behalten (oder nicht). Alle anderen Felder, die ich mit Html.DropDownList
und Html.TextBox
erstellt habe, behalten ihre Status erfolgreich bei, ohne Probleme auf derselben Seite im selben Formular.
Ich habe Stunden damit verbracht, alle anderen Threads und Artikel zu ähnlichen Problemen zu lesen, und es wird viel darüber gesprochen, ICollection
und IDictionary
zu verwenden, um Dinge zu bündeln und für jedes Element einen booleschen Wert zu verwenden Pflegen Sie den Checkbox-Status. Aber ich verstehe nicht zu 100%, wie ich das im Kontext meines eigenen persönlichen Beispiels verwenden kann. Ich möchte die Lösung wirklich einfach halten und nicht Seiten mit neuen Klassen programmieren, nur um meinen Checkbox-Status zu erhalten.
Was ist der sauberste und richtigste Weg, dies zu tun?
Ich habe es nach viel Herumspielen mit den verschiedenen Ansätzen funktioniert.
In der Ansicht:
%Vor%In der empfangenden Controller-Methode:
%Vor%Diese Methode hat eine Reihe von Vorteilen:
Ich würde diesen Ansatz für jeden empfehlen, der die sauberste / aufgebläht-freie Lösung für eine dynamische Checkbox-Liste sucht, wo Sie die IDs brauchen, und Sie wollen nur zur Sache kommen!
Das Problem besteht darin, dass Sie beim Rendern der Liste der Kontrollkästchen keine davon als ausgewählt festlegen. Sie müssen Ihr int[] Features
in ViewData festlegen und dann in Ihrer foreach-Schleife überprüfen, ob die ID dieses Features im Array in ViewData enthalten ist.
etwas wie:
%Vor%Obwohl ich es nicht getestet habe, ist es vielleicht nicht 100%.
Tags und Links asp.net-mvc binding checkbox state viewmodel