2010-09-30 11 views
6

Ho un modulo che contiene un intero gruppo di checkbox e alcuni altri tipi di controllo. Ho bisogno di recuperare i nomi di ogni casella selezionata.Come ottenere tutte le caselle selezionate da una FormCollection

Qual è il modo migliore per farlo? Posso farlo con una query di linq forse?

Quindi, in pseudocodice, sto cercando di fare qualcosa di simile:

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

Aggiornamento sembra che il modo in cui MVC sottopone caselle di controllo è diverso da come una forma normale si sarebbe comportato, come un campo nascosto è anche reso. Ho trovato i dettagli qui: How to handle checkboxes in ASP.NET MVC forms?

Chiunque abbia funzionato con l'aiuto di quel thread e la risposta di BuildStarted di seguito. Il seguente codice ha fatto il trucco.

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

Grazie per queste informazioni. Normalmente utilizzo solo il binding del modello incorporato e non guardo mai nei dettagli ciò che viene prodotto in html per quanto riguarda le checkbox. – Buildstarted

risposta

5

Purtroppo questo tipo di informazione non è disponibile nella collezione. Tuttavia se fai precedere tutte le caselle con qualcosa di simile <input type='checkbox' name='checkbox_somevalue' /> allora è possibile eseguire una query come

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

Dal momento che solo i valori controllato saranno pubblicate indietro non è necessario per convalidare che stanno controllati.

Qui è uno che prende i valori Solo controllato

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

Ricevo definitivamente TUTTE le checkbox postate, non solo quelle controllate. – fearofawhackplanet

+0

È strano. Un rapido test rivela che non è il caso. Potrebbe essere un html specifico che lo causa. ma il modulo '' non sembra funzionare per me. Comunque ho aggiornato la risposta – Buildstarted

+0

ho capito ora. Aggiornata la mia domanda con qualche altro dettaglio. Grazie per l'aiuto :) – fearofawhackplanet

0

Questa è una delle vecchie questioni non attivo per anni, ma mi sono imbattuto su di esso. Il mio problema era che ho una serie di caselle di controllo - diciamo che il nome è "IsValid" e volevo ottenere lo stato di ciascuna delle caselle di controllo (il mio progetto era in MVC 5). Sul modulo di inviare ho fatto il ciclo di raccolta forma e ottenuto i valori come ...

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

Dato sul modulo di inviare il valore del campo nascosto è stato anche pubblicato con le caselle di controllo controllato; la matrice conteneva un valore addizionale della casella di controllo 'false' per SOLO selezionata. Per sbarazzarsi di quelli che ho usato seguendo la funzione; Spero che sia di aiuto a qualcuno e se il mio approccio è sbagliato, allora una soluzione migliore sarebbe utile anche a me!

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(); 
    }