Pflegen Sie den Status einer dynamischen Liste von Kontrollkästchen in ASP.NET MVC

8

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?

    
Aaron 20.07.2010, 15:16
quelle

2 Antworten

14

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:

  • Ermöglicht das Anklicken von Labels, um die entsprechenden Kontrollkästchen (Usability) zu aktivieren.
  • Ermöglicht der Controller-Methode, ein sehr ordentliches Array von Ints zu empfangen, das NUR die ausgewählten Ints enthält - und nicht einen ganzen Stapel von anderen Elementen, die nicht ausgewählt wurden oder false / null / blank / 0 usw. enthalten.
  • Behält den aktivierten Zustand des Kontrollkästchens bei, wenn die Seite das Formular neu lädt, d. h. die Auswahl des Benutzers wird beibehalten.
  • Kein zufälliger / streunender Typ = versteckte Eingabefelder, die aus dem ASP.Net MVC-Html.CheckBox-Standardhelfer erstellt wurden - ich weiß, dass dies aus einem guten Grund geschieht, aber in diesem Fall benötige ich sie nicht so, wie ich es nur möchte um zu wissen, welche IDs ausgewählt wurden und dass sich die IDs in einem einzigen befinden, ordne int [].
  • Keine Massen von zusätzlichen Servern aufgeblähten Klassen, Helfer und andere fröhliche Unordnung erforderlich, um so eine einfache Sache zu erreichen.

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!

    
Aaron 21.07.2010, 11:45
quelle
0

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%.

    
dave thieben 20.07.2010 16:17
quelle