web-dev-qa-db-fra.com

asp.net mvc @ Html.CheckBoxFor

J'ai des cases à cocher dans mon formulaire
enter image description here

J'ai ajouté à mon modèle 

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

 namespace CorePartners_Site2.Models
 {
public class CareerForm
     {
    //....
    public List<CheckBoxes> EmploymentType { get; set; } 
      }
 }

 public class CheckBoxes
 {
     public string Text { get; set; }
     public bool Checked { get; set; }
 }

et ajouté à ma forme

@Html.CheckBoxFor(model => model.EmploymentType, new { id = "employmentType_1" })
@Html.CheckBoxFor(model => model.EmploymentType, new { id = "employmentType_2" })
@Html.CheckBoxFor(model => model.EmploymentType, new { id = "employmentType_3" })

mais j'ai l'erreur
enter image description here

Qu'est-ce qui ne va pas?

17
Heidel

CheckBoxFor prend un bool, vous lui passez un List<CheckBoxes>. Vous devez faire:

@for (int i = 0; i < Model.EmploymentType.Count; i++)
{
    @Html.CheckBoxFor(m => m.EmploymentType[i].Checked, new { id = "employmentType_" + i })
    @Html.HiddenFor(m => m.EmploymentType[i].Text)
    @Html.DisplayFor(m => m.EmploymentType[i].Text)
}

Remarquez que j'ai ajouté une variable HiddenFor pour la propriété Text également, sinon vous perdriez cette information lors de la publication du formulaire, de sorte que vous ne sauriez pas quels éléments vous avez cochés.

Modifier, comme indiqué dans vos commentaires, votre liste EmploymentType est null lorsque la vue est diffusée. Vous devrez aussi renseigner cela, en faisant cela dans votre méthode d'action:

public ActionResult YourActionMethod()
{
    CareerForm model = new CareerForm();

    model.EmploymentType = new List<CheckBox>
    {
        new CheckBox { Text = "Fulltime" },
        new CheckBox { Text = "Partly" },
        new CheckBox { Text = "Contract" }
    };

    return View(model);
}
37
mattytommo

Html.CheckBoxFor attend un Func<TModel, bool> comme premier paramètre. Par conséquent, votre lambda doit renvoyer une bool. Vous renvoyez actuellement une instance de List<Checkboxes>:

model => model.EmploymentType

Vous devez parcourir le List<Checkboxes> pour afficher chaque case à cocher:

@for (int i = 0; i < Model.EmploymentType.Count; i++)
{
    @Html.HiddenFor(m => m.EmploymentType[i].Text)
    @Html.CheckBoxFor(m => m.EmploymentType[i].Checked, 
              new { id = string.Format("employmentType_{0}", i) })
}
3
Oliver

Utilisez ce code:

@for (int i = 0; i < Model.EmploymentType.Count; i++)
{
    @Html.HiddenFor(m => m.EmploymentType[i].Text)
    @Html.CheckBoxFor(m => m.EmploymentType[i].Checked, new { id = "YourId" })
}
2
user1968030

Si une seule case doit être cochée en même temps, utilisez plutôt RadioButtonFor:

      @Html.RadioButtonFor(model => model.Type,1, new { @checked = "checked" }) fultime
      @Html.RadioButtonFor(model => model.Type,2) party
      @Html.RadioButtonFor(model => model.Type,3) next option...

Si vous pouvez en vérifier une autre en même temps, utilisez une excellente extension: CheckBoxListFor :

J'espère que ça va aider

1
Kamil Będkowski