web-dev-qa-db-fra.com

ASP.NET MVC CheckBoxList du modèle avec la propriété List

Toutes mes excuses si le titre n'est pas clair.

J'essaie de renvoyer mon modèle à partir d'un formulaire soumis dans ASP.NET MVC.

Ma question est presque la même que cette question , seulement en ce sens que je n'ai pas de List<Model> mais un modèle comme:

public Model
{
     string UserName {get; set;}
     string Password {get; set;}
     List<Roles> UserRoles {get; set;}
}

où j'ai besoin des UserRoles en tant que cases à cocher que l'administrateur peut sélectionner lors de la création d'un nouvel utilisateur. Ma question est, je ne sais pas comment utiliser un '@ Html.CheckBoxFor' contre une liste. J'ai essayé ceci:

 @for (var i = 0; i < Model.UserRoles.Count();i++ )
 {
   @Html.HiddenFor(model => model.UserRoles[i].RoleID)
   @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
   @Html.LabelFor(model => model.UserRoles[i].Name)
 }

ce qui n'a en aucun cas fonctionné - chaque étiquette sur la page est "Nom", et ma liste était vide dans le POST. Quelqu'un peut-il me donner des conseils à ce sujet?

31
Jonesopolis

Pas besoin de s'éloigner du rasoir du tout.

Cela fonctionne pour moi:

for (var i = 0; i < Model.UserRoles.Count(); i++)
{
    var role = Model.UserRoles[i];
    @Html.HiddenFor(model => model.UserRoles[i].RoleId)
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
    @Html.LabelFor(model=> model.UserRoles[i].Name, role.Name)
}
53
LiverpoolsNumber9

Voir ci-dessous le code, de cette façon, vous n'avez pas besoin de masquer l'ID de rôle, également lorsque vous enregistrez les rôles sélectionnés pour l'utilisateur, vous n'avez pas besoin de parcourir tous les rôles pour voir quel rôle est sélectionné.

Voir

@foreach (Roles info in Model.UserRoles)
{
    <span>
        <input type="checkbox" class="checkbox" name="selectedRoles" value="@info.RoleName" id="@infoRoleName" />
        <label for="@info.RoleName">@info.RoleName</label>
    </span>
}

Action

[HttpPost]
public ActionResult CreateUsers(Model model, string[] selectedRoles)
{
       //
}
10
Lin

D'après votre code dans la vue, la publication devrait fonctionner correctement à condition que votre action de publication ressemble à ceci:

[HttpPost]
public ActionResult Action(Model model)
{
    return View(model);
}

c'est-à-dire en passant votre modèle comme argument.

Assurez-vous également d'avoir également la référence de votre modèle dans la vue:

@model YourNameSpace.Model
1
hutchonoid

Publier une liste de cases à cocher sur le serveur et obtenir la liste des éléments cochés
linq a quitté la jointure pour vérifier si elle était cochée, en générant des cases à cocher, reçu la liste vérifiée

Vue

    List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList();

    var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty()
              select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList();


    foreach (var item in li)
    {       
        @:<div style="width: 30%;  display: inline-block; margin: 1em">
        @:<input type="checkbox" @item.chkd name="CheckedCertificates" value="@item.Cert_id">
        @:<label>@item.Cert_Name</label>
        @:</div> 
    }

Manette

  [HttpPost]
    public ActionResult ManageSurveyGroup(int[] CheckedCertificates)
    {
        return View();
    }
0
user4584103