web-dev-qa-db-fra.com

Pourquoi Html.Checkbox ("Visible") renvoie "true, false" dans ASP.NET MVC 2?

J'utilise Html.Checkbox("Visible") pour afficher une case à cocher à l'utilisateur. Dans post back, la valeur FormCollection["Visible"] est "true, false". Pourquoi?

en vue:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>

dans le contrôleur:

 adslService.Visible = bool.Parse(collection["Visible"]);
24
Jalal

En effet, l’assistant CheckBox génère un champ masqué supplémentaire portant le même nom que la case à cocher (vous pouvez le voir en parcourant le code source généré):

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

Les deux valeurs sont donc envoyées à l'action du contrôleur lorsque vous soumettez le formulaire. Voici un commentaire directement du code source ASP.NET MVC expliquant le raisonnement derrière ce champ caché supplémentaire:

if (inputType == InputType.CheckBox) {
    // Render an additional <input type="hidden".../> for checkboxes. This
    // addresses scenarios where unchecked checkboxes are not sent in the request.
    // Sending a hidden input makes it possible to know that the checkbox was present
    // on the page when the request was submitted.
    ...

Au lieu d'utiliser FormCollection, je vous recommanderais d'utiliser des modèles de vue en tant que paramètres d'action ou directement des types scalaires et de ne pas avoir à vous soucier d'analyser le classeur de modèle par défaut:

public ActionResult SomeAction(bool visible)
{
    ...
}
28
Darin Dimitrov

J'ai récemment traité ce problème et ai mis au point une méthode permettant de contourner la liaison MVC et d'utiliser Contains ("true") sur la chaîne de requête. Rien d'autre n'a fonctionné pour moi.

Si les gens sont coincés avec les autres réponses, voici ce qui a fonctionné pour moi - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting. aspx

9
pfeds

J'ai eu le même problème dans MVC 4,

Cette solution a fonctionné pour moi.

Mon (formulaire) Voir:

@Html.EditorFor(m =>  m.SomeBoolValue)

Pour annuler les valeurs "true, false" en double lorsque CheckBox est true

J'ai stocké le paramètre CheckBox dans un tableau:

var arrParams = Request.Form["SomeBoolValue"].Split(',');

Prenez le premier élément:

string sParam = arrParams[0].ToString();

Analysez-le:

bool BoolValue = bool.Parse(sParam);

Garde le:

MyObject.SomeBoolValue = BoolValue;
2
ZoharAdar

Si vous voulez/devez utiliser FormCollection, au lieu de rechercher true ou false, recherchez true,false ou false.

par exemple. au lieu de cela

adslService.Visible = bool.Parse(collection["Visible"]);

fais ça

adslService.Visible = bool.Parse(collection["Visible"] != "false");
2
Daniel de Zwaan

J'ai eu le même problème. Je l'ai corrigé avec la combinaison suivante (avec l'aide de Darin Dimitrov - merci):

VUE:

<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%>

Manette: 

public ActionResult Index()
{
   ViewData["Optin"] = True;
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form, bool OptIn )
{        
    ViewData["Optin"] = OptIn;
}

Voici la source pour le contrôle avec et sans la case à cocher réellement cochée (pour référence):

Vérifié:

<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

Décoché:

<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

Alors, voici comment j'interprète le comportement:

HTML ne renverra pas la valeur du champ si la case à cocher n'est pas cochée, mais le renverra si c'est le cas. L'assistant ajoute un champ caché après le contrôle de case à cocher (valeur 'False'). Si la case à cocher est cochée, la source indique "" vérifié = "cochée" "si elle n'est pas cochée, cela n'apparaît pas. Donc, si coché = coché, true est renvoyé au contrôleur. Si la case n'est pas cochée, le contrôle n'est pas renvoyé. Le champ masqué, portant le même nom, prend la relève et renvoie un faux. De cette façon, vous avez les deux conditions. Etrange mais ça marche. J'espère que ça aide.

1
David Frey

J'ai déjà une fonction statique que j'utilise partout pour gérer le texte de type booléen et renvoyer true ou false en tant que booléen, alors je m'en occupe juste là

            if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes

            else if (sBool == "true") bReturn = true;

            else if (sBool == "t") bReturn = true;//t-f

            else if (sBool == "1") bReturn = true;//1-0

            else if (sBool == "yes") bReturn = true;//yes-no

            else if (sBool == "y") bReturn = true;//y-n

            else if (sBool == "on") bReturn = true;//on-off
0
djack109

Le comportement par défaut de MVC Entension for Html.Checkbox génère un champ masqué avec celui-ci à publier. Dans mon cas, comme la case à cocher personnalisée que j’ai ajoutée à la page n’est pas liée au modèle comme Html.CheckBoxFor, j’ai décidé d’en faire une simple case à cocher html.

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

Cela peut paraître idiot, mais permettrait de gagner du temps à quelqu'un que de courir après les heures de travail. Cela empêchera de créer une case à cocher utilisant l'extension MVC

0
user1570636