MVC 2 - Übergabe von Enum an CheckBoxFor

7

Nehmen wir an, wir haben ein Modell:

%Vor%

Ist es möglich, Kontrollkästchen zu erstellen, die für dieses Modell Wochentage darstellen? Ich habe das Internet durchsucht, aber keine Lösung gefunden.

Ich meine, es funktioniert mit CheckBoxFor(model=> model.SomeProperty) , aber es funktioniert nicht, wenn SomeProperty ist List<DayOfWeek> . DayOfWeek ist hier eine Aufzählung.

Vielen Dank im Voraus.

    
ilkin 16.11.2010, 12:55
quelle

5 Antworten

12

Sie können die Werte der Enumeration aufzählen und die Kontrollkästchen manuell erstellen. Die Verwendung der gleichen name für jedes Kontrollkästchen wird sie als ein Array in der ActionMethod übergeben.

%Vor%

Ihre Aktionsmethode wäre etwas wie:

%Vor%     
bmancini 16.11.2010, 14:59
quelle
18

Dies würde eine Änderung Ihrer DayOfWeek-Enumeration erfordern, aber ich bevorzuge es als Flag (weniger chaotisch, nur ein Wert usw.). Interessanterweise verwendet Microsoft auch Wochentage in der Enumflags-Dokumentation .

DayOfWeek-Enumeration mit Bit-Flags:

%Vor%

Modell:

%Vor%

Anzeigen:

%Vor%

Controller:

%Vor%

Schnellhilfe für ParseToEnumFlag:

%Vor%

Hintergrund: Der Grund, warum die enum flags Werte in einer geometrischen Reihe sind ( 1,2,4,8 ... ) ist so, dass Wenn die Werte addiert werden, gibt es nur eine mögliche Kombination. Zum Beispiel würden wir wissen, dass 31 nur Mo, Di, Mi, Do und Fr (1 + 2 + 4 + 8 + 16) sein kann.

Update - 3. September 2012

Es scheint, dass ich das ToIEnumerable () verpasst habe, welches eine Erweiterung in unserem Quellcode ist. Es wird eine Zeichenfolge mit Trennzeichen verwendet und in ein IEnumerable umgewandelt, sodass es sich perfekt für durch Kommas getrennte Zahlen eignet. Danke an @escist für das Heads-Up.

%Vor%     
Dan Atkinson 16.11.2010 20:27
quelle
1

Sie könnten Ihre eigene benutzerdefinierte Vorlage erstellen, die weiß, wie die Aufzählungsliste genommen und in Kontrollkästchen umgewandelt wird. Dann müssten Sie den Modellbinder so anpassen, dass er die Enumeration basierend auf dem überprüften Wert bindet. Da Ihre Frage keine Details enthält, bin ich mir nicht sicher, was der Anwendungsfall für dieses Modell ist.

So würden Sie es in Ihrer Ansicht einfügen:

%Vor%     
jfar 16.11.2010 13:32
quelle
1

Hinweis: Ich hatte ein Problem bei der Implementierung von Dan's Antwort mit HasFlag() in der Ansicht, wenn dayOfWeek als var deklariert wurde. Ich musste es als DayOfWeek Enum deklarieren.

Anzeigen:

%Vor%

Ich hatte auch und frage mit der ToIEnumerable -Funktion in Helfer, da es keine Funktion mit diesem Namen (zumindest für mich) gibt.

    
Profex 08.06.2012 20:10
quelle
1

Basierend auf Dan Atkinsons (großartige) Antwort hatte ich hier und da ein paar Abkürzungen gemacht. Mein Vorschlag wäre:

Dieselbe Aufzählung mit [Flags] und Modell .

Für Ansicht würde ich den Typ nicht in int ändern, sondern die Kontrollkästchenwerte als string :

beibehalten %Vor%

Was den Controller viel einfacher macht:

%Vor%

Beachten Sie, dass der Code keine Erweiterungen verwendet.

Prost,

    
Jacek 11.03.2013 12:50
quelle