Je travaille sur une application ASP.NET MVC 4. Cette application a une forme de base. Le modèle de mon formulaire ressemble à ceci:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
Dans mon formulaire, j'ai le code HTML suivant.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Lorsque je publie le formulaire, la valeur Remember du modèle est toujours fausse. Cependant, la propriété Name du modèle a une valeur. J'ai testé cela en définissant un point d'arrêt dans ce qui suit:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Je ne peux pas comprendre. Pourquoi la valeur Checkbox n'est-elle pas définie?
c#
asp.net-mvc-4
JQuery Mobile
la source
la source
Réponses:
Générera:
Comment ça marche:
checkbox
reste décochée, le formulaire soumet uniquement lahidden
valeur (faux)true
pour labool
propriété du modèle<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Cela enverra toujours la valeur par défaut, si elle est cochée.
la source
Puisque vous utilisez Model.Name pour définir la valeur. Je suppose que vous transmettez un modèle de vue vide à la vue.
La valeur de Remember est donc false et définit la valeur de l'élément checkbox sur false. Cela signifie que lorsque vous cochez ensuite la case, vous publiez la valeur «false» avec le formulaire. Lorsque vous ne le sélectionnez pas, il n'est pas publié, donc le modèle par défaut est false. C'est pourquoi vous voyez une fausse valeur dans les deux cas.
La valeur n'est transmise que lorsque vous cochez la case de sélection. Pour faire une case à cocher dans Mvc, utilisez
ou si vous ne souhaitez pas lier le modèle à la vue.
Mvc fait de la magie avec un champ caché pour conserver les valeurs lorsqu'elles ne sont pas sélectionnées.
Edit, si vous avez vraiment une aversion pour faire cela et que vous voulez générer l'élément vous-même, vous pouvez le faire.
la source
@Html.CheckboxFor
code devrait en fait être@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
sur un bouton radio? ou est-ce pas possibletype="radio"
, et la sélection de celle que vous voulez sélectionner dans le HTML est la même que ci-dessuschecked="checked"
,. La différence étant que vous aurez plusieurs<input />
éléments avec le même nom. Vous devez déterminer à laquelle appliquer le HTML supplémentaire.@Html.CheckBoxFor(x => x.Remember)
cela a fonctionné pour moiUtilisez uniquement ceci
la source
$(this).val($(this).is(":checked"));
Au lieu de
utilisation:
Cela vous donnera une case à cocher spécifiquement pour Remember
la source
D'accord, la case à cocher est un peu bizarre. Lorsque vous utilisez l'aide Html, il génère deux entrées de case à cocher sur le balisage, et les deux sont transmises en tant que paire nom-valeur de IEnumerable si elle est cochée.
S'il n'est pas vérifié sur le balisage, il n'est transmis que dans l'entrée masquée qui a la valeur false.
Donc, par exemple sur le balisage que vous avez:
Et dans l'action du contrôleur (assurez-vous que le nom correspond au nom du paramètre de la case à cocher sur le contrôleur):
Ensuite, dans le contrôleur, vous pouvez faire des choses comme:
Je sais que ce n’est pas une solution élégante. J'espère que quelqu'un ici pourra vous donner des conseils.
la source
Pour convertir une valeur renvoyée par une case à cocher dans un formulaire en une propriété booléenne, j'ai utilisé le convertisseur de construction ValueProviderResult dans un ModelBinder personnalisé.
la source
Si vous travaillez avec FormCollection plutôt qu'avec model, l'affectation peut être aussi simple que:
la source
J'ai rencontré un problème similaire et j'ai pu récupérer la valeur de la case à cocher en utilisant une case à cocher, hiddenfor et un petit JQuery comme ceci:
la source
Cela a été une douleur majeure et semble que cela devrait être plus simple. Voici ma configuration et ma solution.
J'utilise l'aide HTML suivante:
@Html.CheckBoxFor(model => model.ActiveFlag)
Ensuite, dans le contrôleur, je vérifie la collecte du formulaire et je traite en conséquence:
la source
user.IsActive = fc["IsActive"] != "false";
je me sens toujours sale d'avoir fait une comparaison de cordes dessus.Je viens de tomber dessus (je ne peux pas croire que ça ne se lie pas!)
Bref!
Publiera une valeur «on» ou «off».
Cela ne se liera pas à un booléen, mais vous pouvez faire cette solution de contournement stupide!
la source
la source
Pour le MVC utilisant Model. Modèle:
HTML:
Dans la fonction [HttpPost], nous pouvons obtenir ses propriétés.
la source
Si vous voulez vraiment utiliser du HTML brut (pour une raison quelconque) et non les extensions HtmlHelper intégrées, vous pouvez le faire de cette façon.
Au lieu de
essayez d'utiliser
Les entrées de case à cocher dans HTML fonctionnent de sorte que lorsqu'elles sont cochées, elles envoient la valeur, et lorsqu'elles ne sont pas cochées, elles n'envoient rien du tout (ce qui entraînera le retour d'ASP.NET MVC à la valeur par défaut du champ,
false
). En outre, la valeur de la case à cocher en HTML peut être autre chose que true / false, donc si vous le souhaitez vraiment, vous pouvez même utiliser une case à cocher pour un champ de chaîne dans votre modèle.Si vous utilisez la fonction intégrée
Html.RenderCheckbox
, elle génère en fait deux entrées: une case à cocher et un champ masqué afin qu'une fausse valeur soit envoyée lorsque la case est décochée (pas simplement rien). Cela peut provoquer des situations inattendues, comme celle-ci:la source
Pour plusieurs cases à cocher avec le même nom ... Code pour supprimer les faux inutiles:
Fonction
Utilise le :
la source
la source
Modifier Souvenez-vous comme ça
Utilisez un bool nullable dans le contrôleur et utilisez la valeur false sur null comme ceci
la source
Dans mon cas, je ne définissais pas la propriété de modèle "Remember" dans la méthode get. Vérifiez votre logique dans le contrôleur. Vous faites peut-être la même chose. J'espère que cette aide!
la source
J'ai lu les autres réponses et je ne l'ai pas tout à fait fonctionné - voici donc la solution avec laquelle j'ai abouti.
Mon formulaire utilise le
Html.EditorFor(e => e.Property)
pour générer la case à cocher, et en utilisantFormCollection
dans le contrôleur, cela transmet une valeur de chaîne de'true,false'
dans le contrôleur.Lorsque je gère les résultats, j'utilise une boucle pour les parcourir - j'utilise également une
InfoProperty
instance pour représenter la valeur actuelle du modèle évaluée à partir du formulaire.Donc, à la place, je vérifie simplement si la chaîne retournée commence par le mot
'true'
, puis je définis une variable booléennetrue
et la transmet au modèle de retour.la source