2009-06-08 7 views
9

J'ai vu beaucoup de questions relatives à ce sujet.Asp.net MVC casse-tête!

J'utilise asp.net MVC 1.0

zone Problème

Si je

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

Alors pourquoi il rend comme

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

Je mets cela en boucle foreach et j'ai 5 lignes.

quand je soumettre le formulaire avec vrai, vrai, vrai, faux, faux puis-je obtenir true,false,true,false,true,false,false,false

dire pour faux => false.

pour true => true, false

Si je

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

Je ne suis pas décoché son. Alors, comment puis-je surmonter ce problème?

Veuillez ne pas poster de réponse en utilisant la boucle dans l'objet formcollection et en vérifiant chaque touche!

+1

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

Répondre

0

Cela se produit car le classeur par défaut requiert que FormCollection ait une valeur pour les paramètres non cumulables. En utilisant cette technique, nous sommes sûrs que la valeur sera envoyée même si la case à cocher n'est pas cochée (par défaut, la valeur n'est envoyée que lorsqu'elle est cochée). Si vous utilisez cette méthode de commande avec une seule entrée html vous obtiendrez une erreur sur le formulaire après avec case cochée (valeur de case à cocher ne sera pas affichée et le liant ne saura pas quoi utiliser pour la valeur de isItemSelected):

public ActionResult SomeActionMethod(bool isItemSelected) 

Vous pouvez essayer d'utiliser quelque chose comme ceci avec une seule entrée html:

public ActionResult SomeActionMethod(bool? isItemSelected) 

Mais dans ce cas isItemSelected sera nulle ou sera vrai. Et cela ne deviendra jamais faux.

1

Dans votre exemple, lorsque vous soumettez formulaire avec vrai, vrai, vrai, faux, faux et vous obtenez

true,false,true,false,true,false,false,false
il est intéressant de noter que vous n'êtes pas réellement obtenir huit valeurs de retour, mais cinq tableaux qui seulement On dirait que c'est le cas parce que toutes les valeurs sont jointes.

Je sais que vous avez demandé de ne pas obtenir une boucle pour votre réponse, mais je peux en utiliser un pour montrer ce qui se passe réellement ici:

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

Alors, pour vos cases à cocher, vous obtiendrez un tableau de valeurs avec deux éléments, et pour les cases non cochées, vous obtiendrez juste un tableau à un seul élément.Par conséquent, pour répondre à votre question comment résoudre ce problème, la réponse consiste à utiliser GetValues ​​plutôt que GetValue, et à considérer vos champs affichés comme des tableaux plutôt que comme des chaînes.

Bonne chance!

+0

MVC3 avec .Net4.0 n'a pas GetValues ​​ –

0

Eh bien, il existe plusieurs façons de faire selon vos besoins.

J'utilise cette méthode.

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

Ceci est des cases à cocher.

Sur le côté serveur, je vais également avoir un tableau d'ID de l'élément dans le modèle. Je le vérifier si elle est dans le tableau

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

Différentes personnes ont différents tests.

2

Je sais que ce n'est pas l'élégant mais un c'est ce que je l'ai fait..

Remplacer ("true, false", "true") de Split

collection [ "réponse"] ('') .Lister();

+0

Cela fonctionne bien événement dans MVC3 et Framework 4,0 –

0

cela a été destiné à utiliser pour CheckBox juste juste simple, ce que vous voulez est CheckBoxList, qui ne couvre encore dans l'API de ASP.net MVC

Si vous cherchez quelque chose pour comme checkboxlist, peut-être vous devriez écrire votre propre aide, vous fournir le HTML bien comprendre ..

C'est tout! :)

0

plus facile de vérifier si AttemptedValue.Contains (« true ») - il sera, si elle est cochée, pas si elle est décochée ....

1

Personnellement, je pense avoir à vérifier « true, false "partout sur le serveur est une douleur. J'ai écrit un correctif jquery qui va supprimer le champ caché supplémentaire créé par l'aide Html.Checkbox quand une case est cochée, puis le rajouter si la case n'est pas cochée. Les valeurs du serveur seront toujours "true" ou "false". Les listes de cases à cocher sont un peu subjectives dans la façon dont vous voulez qu'elles agissent, mais j'enlève «false» de la valeur, ce qui signifie que la valeur du formulaire sera exclue si toutes les cases de la liste ne sont pas cochées.

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

J'ai eu assez bon succès en utilisant cette technique. S'il vous plaît laissez-moi savoir si vous l'essayez et avez des problèmes.

1

Vous devrez effectuer votre propre liaison de modèle pour les valeurs CheckBox.

Obtenir la liste des valeurs de la FormCollection ou Request.Form pour cet ID CheckBox et remplacer la valeur true, false par true: Maintenant vous avez

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

une liste si un CheckBox a été choisi ou non .. ..faire le reste vous :)

0

dans la vue:

<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

Pour obtenir la valeur de case à cocher même il est vrai ou faux

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