Obtenir la valeur de la case à cocher ASP.NET MVC 4

je travaille sur un ASP.NET MVC 4 app. Cette application a une forme 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 ma forme, 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>

quand je poste le formulaire, La valeur de mémoire dans le modèle est toujours fausse. Cependant, la propriété Name dans le modèle a une valeur. J'ai testé ceci en mettant un point de rupture dans le suivant:

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

Je ne comprends pas. Pourquoi la valeur de la case à cocher n'est-elle pas réglée?

107
demandé sur JQuery Mobile 2013-02-06 17:52:07

18 réponses

@Html.EditorFor(x => x.Remember)

va générer:

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

comment ça marche:

  • si checkbox n'est pas vérifié, le formulaire ne présente que la valeur hidden (false)
  • si coché, alors le formulaire soumet deux champs (false et true) et les ensembles MVC true pour le modèle bool propriété

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

cela enverra toujours la valeur par défaut, si l'option est cochée.

182
répondu webdeveloper 2018-02-08 14:13:52

puisque vous utilisez Model.Nom pour définir la valeur. Je suppose que vous passez un modèle de vue vide à la vue.

ainsi la valeur pour Remember est false, et définit la valeur sur l'élément de la case à cocher à false. Cela signifie que lorsque vous sélectionnez la case à cocher, vous affichez la valeur "faux" avec le formulaire. Quand vous ne le sélectionnez pas, il n'est pas posté, donc le model est par défaut à false. Qui est pourquoi vous voyez valeur faux dans les deux cas.

la valeur n'est transmise que lorsque vous cochez la case Sélectionner. Pour faire une case à cocher dans Mvc utiliser

@Html.CheckBoxFor(x => x.Remember)

ou si vous ne voulez pas lier le modèle à la vue.

@Html.CheckBox("Remember")

Mvc fait de la magie avec un champ caché pour persister les valeurs quand elles ne sont pas sélectionnées.

éditer, si vous avez vraiment une aversion à faire cela et que vous voulez générer l'élément vous-même, vous pouvez le faire.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />
64
répondu Dan Saltmer 2016-10-14 09:15:12

utiliser seulement ce

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});
6
répondu Bekir Topuz 2017-03-19 21:21:04

OK, la case à cocher est un peu bizarre. Lorsque vous utilisez HTML helper, il génère deux entrées de case à cocher sur le markup, et les deux se passent dans une paire de valeur de IEnumerable si elle est cochée.

si elle n'est pas cochée sur le markup, elle n'est transmise que dans l'entrée cachée qui a une valeur de false.

donc par exemple sur le markup vous avez:

      @Html.CheckBox("Chbxs") 

et dans l'action du contrôleur (s'assurer que le nom correspond au nom param de la case à cocher sur le controller):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

puis dans le controller vous pouvez faire des choses comme:

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

je sais que ce n'est pas une solution élégante. J'espère que quelqu'un ici peut donner quelques conseils.

4
répondu Yini 2014-01-26 07:11:07

au lieu de

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

utiliser:

 @Html.EditorFor(x => x.Remember)

qui vous donnera une case à cocher spécifiquement pour se souvenir

3
répondu Robert 2013-02-06 13:54:53

pour convertir une valeur retournée d'une case à cocher dans une forme à une propriété booléenne, j'ai utilisé le convertisseur ValueProviderResult dans build dans un ModelBinder personnalisé.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
3
répondu Chris 2015-12-02 06:47:19

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 little JQuery comme ça:

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

<script>

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

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

    })

</script>
2
répondu John Meyer 2014-12-01 22:07:15

cela a été une douleur majeure et se sent comme il devrait être plus simple. Voici mon installation et ma solution.

j'utilise le helper HTML suivant:

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

ensuite, dans le controller, je vérifie la collecte de formulaires et le traitement en conséquence:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
2
répondu fujiiface 2016-10-19 15:07:39
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });
1
répondu Surendran 2016-01-13 14:53:03

pour le MVC en utilisant le modèle. Numéro de l'article:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

HTML:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

dans la fonction [HttpPost], nous pouvons obtenir ses propriétés.

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}
1
répondu Lulala 2017-12-06 02:41:26

je viens de tomber sur ce (Je ne peux pas croire qu'il ne lie pas sur/hors!)

de toute façon!

<input type="checkbox" name="checked" />

affichera une valeur de "on" ou "off".

Ce l'HABITUDE lier à un booléen, mais vous pouvez faire ce stupide solution de contournement!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}
0
répondu Yablargo 2015-01-28 22:12:39

pour plusieurs cases à cocher avec le même nom... Code pour supprimer les faux inutiles:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

fonction

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

Utiliser :

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}
0
répondu Pascal Carmoni 2015-05-19 16:02:11
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}
0
répondu 2015-06-14 12:50:27

Modifier Rappelez-vous, comme ce

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

utiliser null bool dans le contrôleur et fallback à false sur null comme ceci

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}
0
répondu irfandar 2016-12-19 07:55:36

dans mon cas, je ne définissais pas la propriété model" Remember " dans la méthode get. Vérifier votre logique dans le contrôleur. Vous pouvez peut-être faire de même. J'espère que cela aide!

0
répondu Nour Lababidi 2017-11-07 04:41:56

si vous voulez vraiment utiliser du HTML pur (pour quelque raison que ce soit) et pas les extensions HtmlHelper intégrées, vous pouvez le faire de cette façon.

au lieu de

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

essayer d'utiliser

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

" Checkbox entrées dans le travail HTML de sorte que quand ils sont cochés, ils envoient la valeur, et quand ils ne sont pas cochés, ils n'envoient rien du tout (ce qui causera ASP.NET MVC to fallback to the valeur par défaut du champ false ). En outre, la valeur de la case à cocher en HTML peut être n'importe quoi, pas seulement vrai/faux, donc si vous voulez vraiment, vous pouvez même utiliser une case à cocher pour un champ de chaîne dans votre modèle.

si vous utilisez le Html.RenderCheckbox intégré , il affiche en fait deux entrées: une case à cocher et un champ caché de sorte qu'une fausse valeur est envoyée lorsque la case à cocher n'est pas cochée (pas juste rien). Qui peut causer des situations inattendues, comme ceci:

0
répondu Tom Pažourek 2018-02-08 14:31:37

j'ai lu les autres réponses et je n'ai pas tout à fait réussi à le faire fonctionner - voici donc la solution que j'ai trouvée.

mon formulaire utilise le Html.EditorFor(e => e.Property) pour générer la case à cocher, et en utilisant FormCollection dans le contrôleur, cela passe une valeur de chaîne de caractères de 'true,false' dans le contrôleur.

quand je manipule les résultats j'utilise une boucle pour les parcourir - j'utilise aussi une instance InfoProperty pour représenter la valeur du modèle courant évalué à partir de la forme.

donc à la place je viens de vérifier si la chaîne retournée commence par le mot 'true' et ensuite mettre une variable booléenne à true et passer cela dans le modèle de retour.

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}
0
répondu C Gil 2018-04-12 14:08:53

si vous travaillez avec FormCollection plutôt qu'avec model, la tâche peut être aussi simple que:

MyModel.Remember = fields["Remember"] != "false";
0
répondu Aaron Carter 2018-08-09 14:23:43