2009-06-08 11 views
9

Ho visto molte domande relative a questo argomento.asp.net MVC checkbox mal di testa!

Sto usando asp.net MVC 1.0

zona Problema

Se uso

<%= Html.CheckBox("Status", true) %> 

Allora perché Rende come

<input checked="checked" id="Status" name="Status" type="checkbox" value="true" /><input name="Status" type="hidden" value="false" /> 

Ho messo questo in ciclo foreach e ho 5 righe.

quando ho presentare il modulo con vero, vero, vero, falso, falso tanto sono true,false,true,false,true,false,false,false

vale a dire per falso => ​​false.

per la vera => vero, falso

Se uso

<input type="checkbox" value="true" name="Status" checked="checked" /> 

Poi non capisco incontrollato propria.

quindi come faccio a superare questo problema?

Si prega di non postare risposta con l'uso del loop nell'oggetto di raccolta di file e controllando ogni tasto!

+1

duplicare? http://stackoverflow.com/questions/220020/how-to-handle-checkboxes-in-asp-net-mvc-forms – Peter

risposta

0

Viene così visualizzato perché il raccoglitore predefinito richiede che FormCollection abbia un valore per i parametri non inutilizzabili. Usando questa tecnica siamo sicuri che il valore verrà inviato anche se la casella non è selezionata (di default il valore inviato solo quando è selezionato). Se si utilizza questo metodo di controllo con un solo ingresso html si otterrà errore sul modulo di post con casella non spuntata (valore della casella di controllo non sarà pubblicato e legante non saprà cosa usare per il valore di isItemSelected):

public ActionResult SomeActionMethod(bool isItemSelected) 

Si può provare l'uso qualcosa di simile con l'ingresso solo html:

public ActionResult SomeActionMethod(bool? isItemSelected) 

Ma in questo caso isItemSelected sarà nullo o sarà vero. E non diventerà mai falso.

1

Nel tuo esempio, quando si invia modulo con vero, vero, vero, falso, falso e si ottiene

true,false,true,false,true,false,false,false
è interessante notare che non sono in realtà sempre otto valori indietro, ma cinque matrici che semplicemente sembra che questo sia il caso perché tutti i valori sono uniti.

So che hai chiesto di non ottenere un ciclo per la risposta, ma posso usare uno per dimostrare ciò che sta realmente accadendo qui:

foreach (string key in postedForm.AllKeys) { 
    // "value" will contain a joined/comma-separated list of ALL values, 
    // including something like "true,false" for a checked checkbox. 
    string value = postedForm[key].GetValue; 
    // "values" will be an array, where you can access its first element, 
    // e.g., values[0], to get the actual intended value. 
    string[] values = postedForm.GetValues(key); 
} 

Così, per le caselle selezionate, si otterrà un array di valori con due elementi, e per caselle deselezionate, otterrai solo un array a elemento singolo.

Così, per rispondere alla tua domanda come superare questo problema, la risposta sta nell'usare GetValues ​​anziché GetValue e pensare ai campi inviati come array piuttosto che come stringhe.

Buona fortuna!

+0

MVC3 con .Net4.0 non ha GetValues ​​ –

0

Beh, ci sono un paio di modi in cui puoi fare in base alle tue esigenze.

Io uso questo metodo.

<input type="checkbox" value="<%= item.ID %>" name="check" checked="checked")" /> 

Questo è possibile caselle di controllo.

Sul lato server avrò anche un array di ID di articolo nel modello. Così ho verificare che se è in serie

var strArray = form["checkbox"]; //Request.form["checkbox"] or "FormCollection form" in action parameter; array of ID's in comma separated string. 

persone diverse hanno diverse prove.

2

So che questo non è l'elegante uno, ma questo è quello che ho fatto:..

collezione [ "risposta"] Sostituire ("true, false", "true") Split ('') .Elencare();

+0

Questo funziona bene evento in MVC3 e Framework 4.0 –

0

Questo è stato destinato da utilizzare per appena appena semplice CheckBox, quello che vuoi è CheckBoxList, che non è ancora coprire nella API dei ASP.net MVC

Se alla ricerca di qualche cosa come checkboxlist, forse dovresti scrivere il tuo helper, comprenderti bene l'HTML ..

Ecco fatto! :)

0

facile solo per verificare se AttemptedValue.Contains ("true") - lo farà, se è selezionata, se non è incontrollato ....

1

Personalmente penso di dover verificare la presenza di "true, false "ovunque sul server è un dolore. Ho scritto una correzione jquery che rimuoverà il campo nascosto aggiuntivo creato dall'helper Html.Checkbox quando una casella è selezionata, quindi aggiungila di nuovo se la casella è deselezionata. I valori del server saranno sempre "true" o "false". Gli elenchi delle caselle di controllo sono di tipo soggettivo nel modo in cui si desidera che agiscano, di cui discuto, ma rimuovo "false" dal set di valori, il che significa che il valore del modulo verrà escluso se tutte le caselle nell'elenco non sono selezionate.

http://www.mindstorminteractive.com/blog/?p=386

che ho avuto abbastanza buon successo con questa tecnica. Per favore fatemi sapere se provate e avete problemi.

1

È necessario eseguire il binding del proprio modello per i valori CheckBox.

Ottenere l'elenco dei valori dal FormCollection o Request.Form per quella CheckBox id e sostituire vero, falso con il vero:

string chkBoxString = Request.Form["checkboxID"].Replace("true,false", "true") 

Ora avete una lista di se un CheckBox è stato selezionato o no .. ..fanno il te stesso :)

0

riposo in vista:

<input id="radio5" type="checkbox" name="rb_abc" value="5"/> 

Controller:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult YourForm(FormCollection fc) 
{ 
     if (fc["rb_abc"] == "on") 
     { 
      //Hey .. you have selected a Radio Button.. just kidding.. its a CheckBox 
     } 
} 
0

per ottenere il valore casella di controllo anche se è vero o falso

var boolValue = bool.Parse(collection.GetValues("checkboxID")[0])