2010-09-30 9 views
6

Ich habe ein Formular, das eine ganze Reihe von Kontrollkästchen und einige andere Arten der Kontrolle enthält. Ich muss die Namen jedes ausgewählten Kontrollkästchens abrufen.Abrufen aller ausgewählten Kontrollkästchen aus einer FormCollection

Was ist der beste Weg, dies zu tun? Kann ich es vielleicht mit einer linq-Abfrage machen?

So in Pseudo-Code, suche ich so etwas wie dies zu tun:

var names = formCollection 
       .Where(c => c is Checkbox && c.Checked) 
       .Select(c => c.Name); 

aktualisieren Es scheint, die Art und Weise MVC Kontrollkästchen einreicht unterscheidet sich wie eine normale Form verhalten würde, wie ein verstecktes Feld ist auch gerendert. Ich fand die Details hier: How to handle checkboxes in ASP.NET MVC forms?

Anywho, ich habe es funktioniert mit Hilfe dieses Threads und die Antwort von BuildStarted unten. Der folgende Code hat den Trick gemacht.

var additionalItems = form.AllKeys 
     .Where(k => form[k].Contains("true") && k.StartsWith("addItem")) 
       .Select(k => k.Substring(7)); 
+0

Danke für diese Info. Ich benutze normalerweise nur die eingebaute Modellbindung und habe nie wirklich ins Detail geschaut, was im Hinblick auf die Checkboxen ausgegeben wird. – Buildstarted

Antwort

5

Leider ist diese Art von Informationen in der Sammlung nicht verfügbar. Allerdings, wenn Sie alle Ihre Kontrollkästchen mit so etwas wie <input type='checkbox' name='checkbox_somevalue' /> voranstellen, dann können Sie eine Abfrage wie

var names = formCollection.AllKeys.Where(c => c.StartsWith("checkbox")); 

Da nur die geprüften Werte werden geschrieben zurück laufen Sie nicht bestätigen müssen, dass sie geprüft sind.

Hier ist eine, die nur überprüft Werte

var names = formCollection.AllKeys.Where(c => c.StartsWith("test") && 
         formCollection.GetValue(c) != null && 
         formCollection.GetValue(c).AttemptedValue == "1"); 
+0

Ich bekomme definitiv alle Checkboxen zurück, nicht nur die überprüften. – fearofawhackplanet

+0

Das ist seltsam. Ein schneller Test zeigt, dass dies nicht der Fall ist. Könnte eine spezifische HTML sein, die das verursacht. aber das '' form scheint für mich nicht zu funktionieren. Allerdings habe ich die Antwort aktualisiert – Buildstarted

+0

Ich habe es jetzt herausgefunden. Meine Frage wurde mit einigen weiteren Details aktualisiert. Danke für Ihre Hilfe :) – fearofawhackplanet

0

Dieser packt ist eine der alten Fragen nicht aktiv seit Jahren, aber ich stolperte auf sie. Mein Problem war, dass ich eine Reihe von Kontrollkästchen habe - sagen wir, der Name ist "IsValid" und wollte den Status jedes der Kontrollkästchen (mein Projekt war in MVC 5). Auf Formular ich die Schleife der Form Sammlung tat und bekam die Werte als ...

if (key.Contains("IsValid")) 
        sV = (string[])collection.GetValue(key.ToString()).RawValue; 

Da auf Formular veröffentlicht der versteckte Feldwert auch mit dem überprüften Kontrollkästchen geschrieben wurde; Das Array enthielt einen zusätzlichen Wert von 'false' für NUR aktiviertes Kontrollkästchen. Um diese loszuwerden, habe ich folgende Funktion benutzt; Ich hoffe, dass es jemandem hilft und wenn meine Herangehensweise falsch ist, wäre eine bessere Lösung auch für mich hilfreich!

sV = FixCheckBoxValue(sV); 

     private string[] FixCheckBoxValue(string[] sV) 
    { 
     var iArrayList = new List<string>(sV); 

     for (int i = 0; i < iArrayList.Count; i++) 
     { 
      if (iArrayList[i].ToString() == "true") 
      { 
       iArrayList.RemoveAt(i + 1); 
      }     
     } 
     return iArrayList.ToArray(); 
    }