web-dev-qa-db-fra.com

Passer les valeurs de checkBox à l'action du contrôleur dans asp.net mvc4

Je veux tester si la case à cocher est cochée ou non de mon acion methon, ce dont j'ai besoin est de passer la valeur de la case à cocher de vue au contrôleur

c'est mon avis 

   @using (Html.BeginForm("Index", "Graphe"))
    {

           <table style="width: 100%;" border="1">
          <tbody>
          <tr>
          <td>Responsable:</td>
          <td><select id="Responsables" name="responsables"  ><option>Selectionnez --</option></select></td>
           <td><input id="responsable" name="checkResp" type="checkbox" /> </td>
</tr>
               <tr> <td><input type="submit" value="Afficher" id="ButtonSubmit"/></td>

                <td><input class="button" id="ButtonReset" type="button" value="Annuler"  /></td>
            </tr>
</tbody>

et j'essaye ça:

 public ActionResult Index( string responsables, bool checkResp)
    {
        Highcharts chart = new Highcharts("chart");

        if (responsables != null)
        {

                if (checkResp)
                chart = Global();

                else
                 chart = Resp(responsables);

            }
        else
            chart = Global();
        return View(chart);

    }

, mais j'ai cette erreur:

Null for the paramètre «checkAct» de type non Nullable «System.Boolean» pour la méthode «System.Web.Mvc.ActionResult Index (System.String, System.String, Boolean)» dans «Projet .Controllers.GrapheController ». Un paramètre facultatif doit être un type référence, un type Nullable ou être déclaré en tant que paramètre facultatif .

Pouvez-vous m'aider s'il vous plaît !

20
Nancy

Si une case à cocher est cochée, les valeurs de publication contiendront une paire clé-valeur de la forme [InputName]=[InputValue]

Si une case à cocher n'est pas cochée, le formulaire posté ne contient aucune référence à la case à cocher.

Sachant cela, ce qui suit fonctionnera:

Dans le code de balisage:

 <input id="responsable" name="checkResp" value="true" type="checkbox" />

Et votre signature de méthode d'action:

public ActionResult Index( string responsables, bool checkResp = false)

Cela fonctionnera car, lorsque la case à cocher est cochée, la publication contiendra checkResp=true, et si la case à cocher n'est pas cochée, le paramètre sera par défaut à false.

54
Andrew Shepherd

Pour une raison quelconque, la méthode Andrew de créer manuellement la case à cocher ne fonctionnait pas pour moi avec Mvc 5. 

@Html.CheckBox("checkResp")

créer une case à cocher permettant de jouer à Nice avec le contrôleur.

13
Philip Pittle

essayez d'utiliser la collection de formulaires 

<input id="responsable" value="True" name="checkResp" type="checkbox" /> 

[HttpPost]
public ActionResult Index(FormCollection collection)
{
     if(!string.IsNullOrEmpty(collection["checkResp"])
     {
        string checkResp=collection["checkResp"];
        bool checkRespB=Convert.ToBoolean(checkResp);
     }

}
9
COLD TOLD

Aucune des solutions précédentes ne fonctionnait pour moi ..__ Enfin, j’ai trouvé que l’action devait être codée comme suit:.

public ActionResult Index(string MyCheck = null)

et ensuite, une fois cochée, la valeur passée était "on", pas "true". Sinon, il est toujours nul.

J'espère que ça aide un jour.

3
Néstor Sánchez A.

Si vous voulez que votre valeur soit lue par le contrôleur MVT lorsque vous soumettez le formulaire et que vous ne faites pas quoi traiter avec des entrées masquées. Ce que vous pouvez faire est d’ajouter l’attribut value à votre checkbox et de le définir sur true ou false

MVT ne reconnaîtra pas la propriété viewModel myCheckbox à true ici

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

mais si vous ajoutez 

<input type="checkbox" name="myCheckbox" checked="checked" value="true" />

Script qui le fait:

$(document).on("click", "[type='checkbox']", function(e) {
        if (this.checked) {
            $(this).attr("value", "true");
        } else {
            $(this).attr("value","false");}
    });
3
Matas Vaitkevicius

J'ai eu un problème avec la plupart des solutions, car j'essayais d'utiliser une case à cocher avec un style spécifique. J'avais besoin des valeurs de la case à cocher pour les envoyer à poster à partir d'une liste, une fois les valeurs collectées, nécessaires à la sauvegarde. J'ai réussi à contourner le problème après un moment.

J'espère que cela aidera quelqu'un . Voici le code ci-dessous:

Manette:

    [HttpGet]
    public ActionResult Index(List<Model> ItemsModelList)
    {

        ItemsModelList = new List<Model>()
        {                
            //example two values
            //checkbox 1
            new Model{ CheckBoxValue = true},
            //checkbox 2
            new Model{ CheckBoxValue = false}

        };

        return View(new ModelLists
        {
            List = ItemsModelList

        });


    }

    [HttpPost]
    public ActionResult Index(ModelLists ModelLists)
    {
        //Use a break point here to watch values
        //Code... (save for example)
        return RedirectToAction("Index", "Home");

    }

Modèle 1:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace waCheckBoxWithModel.Models
    {
        public class Model
{

    public bool CheckBoxValue { get; set; }

}
    }

Modèle 2:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace waCheckBoxWithModel.Models
    {
        public class ModelLists
{

    public List<Model> List { get; set; }

}
    }

Voir (index):

    @{
ViewBag.Title = "Index";

@model waCheckBoxWithModel.Models.ModelLists
    }
    <style>

.checkBox {
    display: block;
    position: relative;
    margin-bottom: 12px;
    cursor: pointer;
    font-size: 22px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

    /* hide default checkbox*/
    .checkBox input {
        position: absolute;
        opacity: 0;
        cursor: pointer;
    }

/* checkmark */
.checkmark {
    position: absolute;
    top: 0;
    left: 0;
    height: 25px;
    width: 25px;
    background: #fff;
    border-radius: 4px;
    border-width: 1px;
    box-shadow: inset 0px 0px 10px #ccc;
}

/* On mouse-over change backgroundcolor */
.checkBox:hover input ~ .checkmark {
    /*background-color: #ccc;*/
}

/* background effect */
.checkBox input:checked ~ .checkmark {
    background-color: #fff;
}

/* checkmark (hide when not checked) */
.checkmark:after {
    content: "";
    position: absolute;
    display: none;
}

/* show checkmark (checked) */
.checkBox input:checked ~ .checkmark:after {
    display: block;
}

/* Style checkmark */
.checkBox .checkmark:after {
    left: 9px;
    top: 7px;
    width: 5px;
    height: 10px;
    border: solid #1F4788;
    border-width: 0 2px 2px 0;
    -webkit-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
}
   </style>

    @using (Html.BeginForm())
    {

    <div>

@{
    int cnt = Model.List.Count;
    int i = 0;

}

@foreach (var item in Model.List)
{

    {
        if (cnt >= 1)
        { cnt--; }
    }

    @Html.Label("Example" + " " + (i + 1))

    <br />

    <label class="checkBox">
        @Html.CheckBoxFor(m => Model.List[i].CheckBoxValue)
        <span class="checkmark"></span>
    </label>

    { i++;}

    <br />

}

<br />
<input type="submit" value="Go to Post Index" />    

    </div>

    }
0
Nelson Martins

Vous devriez taper vos points de vue avec force. Ensuite, vous pouvez faire ceci:

public class YourViewModel {
    public bool ConditionaValue { get; set; }
}

Dans votre vue, vous pouvez créer une case à cocher qui se liera à cette valeur booléenne:

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

Si cette case est cochée, la propriété du modèle sera vraie.

Pour votre problème immédiat cependant .. vous devez nommer votre case à cocher pour qu'elle corresponde au même nom que vos paramètres de méthode d'action .. et ils devraient être bool .. 

0
Simon Whitehead