129 votes

Obtenir la valeur d'une case à cocher en ASP.NET MVC 4

Je travaille sur une application ASP.NET MVC 4. Cette application comporte un formulaire de base. Le modèle de mon formulaire ressemble à ce qui suit :

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

Dans mon formulaire, j'ai le 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">&nbsp;Remember Me?</label>

Lorsque je poste le formulaire, la valeur Remember dans le modèle est toujours fausse. Cependant, la propriété Name du modèle a une valeur. J'ai testé cela en mettant un point d'arrêt dans ce qui suit :

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

Je n'arrive pas à comprendre. Pourquoi la valeur de la case à cocher n'est-elle pas définie ?

3voto

tomp Points 1170

Si vous souhaitez vraiment utiliser du HTML simple (pour quelque raison que ce soit) et non les extensions HtmlHelper intégrées, vous pouvez le faire de cette manière.

Au lieu de

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

essayez d'utiliser

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

Les cases à cocher en HTML fonctionnent de telle sorte que lorsqu'elles sont cochées, elles envoient la valeur, et lorsqu'elles ne le sont pas, elles n'envoient rien du tout (ce qui fait que ASP.NET MVC se rabat sur la valeur par défaut du champ), false ). De plus, la valeur de la case à cocher en HTML peut être n'importe quoi, et pas seulement vrai ou faux, donc si vous le voulez vraiment, vous pouvez même utiliser une case à cocher pour un champ de type chaîne dans votre modèle.

Si vous utilisez la fonction intégrée Html.RenderCheckbox En effet, il produit deux entrées : une case à cocher et un champ caché, de sorte qu'une valeur fausse est envoyée lorsque la case à cocher n'est pas cochée (et non pas rien du tout). Cela peut provoquer des situations inattendues, comme celle-ci :

3voto

Aaron Carter Points 31

Si vous travaillez avec FormCollection plutôt qu'avec un modèle, l'affectation peut être aussi simple que :

MyModel.Remember = fields["Remember"] != "false";

3voto

Chris Points 190

Pour convertir une valeur renvoyée par une case à cocher dans un formulaire en une propriété booléenne, j'ai utilisé le convertisseur intégré de ValueProviderResult dans un ModelBinder personnalisé.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));

2voto

fujiiface Points 42

C'est un véritable calvaire et il semble que cela devrait être plus simple. Voici mon installation et ma solution.

J'utilise l'aide HTML suivante :

@Html.CheckBoxFor(model => model.ActiveFlag)

Ensuite, dans le contrôleur, je vérifie la collection de formulaires et je traite en conséquence :

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;

2voto

John Meyer Points 71

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 peu de JQuery comme suit :

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X