Why Html.Case à cocher("Visible") renvoie "true, false" dans ASP.NET MVC 2?

j'utilise Html.Checkbox("Visible") pour afficher une case à cocher pour l'utilisateur. Dans le post de retour, FormCollection["Visible"] la valeur est "vrai", "faux". Pourquoi?

vue:

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

dans le contrôleur:

 adslService.Visible = bool.Parse(collection["Visible"]);
22
demandé sur Jalal 2011-05-09 15:10:12

7 réponses

c'est parce Que le CheckBox helper génère champ caché avec 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" />

ainsi les deux valeurs sont envoyées à l'action du controller lorsque vous soumettez le formulaire. Voici un commentaire directement de la ASP.NET code source 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 recommande d'utiliser les modèles de vue comme action paramètres ou directement types scalaires et laisser le tracas de l'analyse au classeur de modèle par défaut:

public ActionResult SomeAction(bool visible)
{
    ...
}
26
répondu Darin Dimitrov 2011-05-09 11:12:52

j'ai récemment abordé cette question et j'ai trouvé une méthode pour contourner la liaison MVC et 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 alors c'est ce qui a fonctionné pour moi - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

9
répondu pfeds 2012-03-20 01:55:39

Si vous voulez/besoin d'utiliser FormCollection, au lieu de vérifier true ou false, vérifier true,false ou false.

par exemple au lieu de cela

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

faire

adslService.Visible = bool.Parse(collection["Visible"] != "false");
2
répondu Daniel de Zwaan 2012-11-22 03:24:42

j'ai eu le même problème en MVC 4,

Cette solution a fonctionné pour moi.

Mon formulaire)Vue:

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

pour annuler les valeurs "true,false" quand CheckBox est true

j'ai stocké la case à cocher param dans un tableau:

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

Saisir le premier élément:

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

Parse:

bool BoolValue = bool.Parse(sParam);

Conserver:

MyObject.SomeBoolValue = BoolValue;
2
répondu ZoharAdar 2016-01-07 10:06:37

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

VIEW:

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

Contrôleur:

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ésactivé:

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

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

HTML ne renvoie pas le message valeur du champ si la case à cocher n'est pas cochée, mais sera postée si elle l'est. L'assistant ajoute un champ caché après le contrôle de case à cocher (valeur False). Si la case est cochée, la source affiche "coché = 'coché'" si elle n'est pas cochée, cela n'apparaît pas. Donc, si coché = coché, true est transmis au contrôleur. Si la boîte n'est pas cochée, le contrôle n'est pas renvoyé, de sorte que le champ caché, appelé le même, prend le relais et renvoie un faux. De cette façon, vous avez les deux conditions. Étrange, mais ça fonctionne. J'espère que cette aide.

1
répondu David Frey 2011-06-24 17:50:38

le comportement par défaut de L'extension MVC pour Html.Case, génère un champ caché avec elle pour être posté. Dans mon cas, parce que la case à cocher personnalisée que j'ai ajouté à la page n'est pas modèle lié comme Html.CheckBoxFor, j'ai décidé de le faire comme simple html checkbox.

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

cela peut sembler idiot, mais cela sauverait le temps de quelqu'un plutôt que de courir après des problèmes. Cela empêchera de créer une case à cocher en utilisant l'extension MVC

0
répondu user1570636 2017-05-18 10:05:06

j'ai déjà une fonction statique que j'utilise partout pour gérer le texte de type booléen et retourner true ou false comme booléen donc 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
répondu djack109 2017-07-06 13:26:10