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"]);
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)
{
...
}
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
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");
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;
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.
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
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