-->

Pass IEnumerable list to controller

2020-02-14 16:45发布

问题:

In my asp.net MVC 4 project, I'm trying to pass IEnumerable list from view to controller. The problem is that the list receiverd in the action is null. Any help please.

This is part of my code

view :

@model IEnumerable<PFEApplication.Models.agent>
<div id="Leader"> 
@using (Ajax.BeginForm("AddNewLeader", "Equipe", FormMethod.Post, new AjaxOptions {
                    UpdateTargetId = "Leader",
                    HttpMethod = "Post",
                    InsertionMode = InsertionMode.Replace
                    }))
  {
    foreach (var item in Model)
    {
       @Html.HiddenFor(modelItem => item.ID_agent)
       @Html.RadioButtonFor(modelItem => item.SelectedAgent, item.ID_agent)           

       @Html.DisplayFor(modelItem => item.nom_agent) 
       @Html.DisplayFor(modelItem => item.prenom_agent)           
        <br />           

      }
      <br />
     <input type="submit" value="Save" />
     } 
     </div>

Controller :

     public ActionResult AddNewLeader(IEnumerable<agent> ListAgent) 
    {        
            [...]
            if(ListAgent!=null)
            foreach (var ag in ListAgent) {
                if (ag.SelectedAgent != 0) { Id = ag.SelectedAgent; }
            }
            agent agentRemplace = db.agents.Single(a => a.ID_agent == Id);                    
            db.SaveChanges();               

        return PartialView("exitAddNewLeader");
    } 

回答1:

The problem is in fact that this expression:

@Html.HiddenFor(modelItem => item.ID_agent)

and similar as well cannot derive a correct name for the HTML input control, and the resulting request parameters are not parsed by model binder. Usually this is fixed by replacing foreach with for:

@fore (int i=0; i<Model.Count; i++)
{
   @Html.HiddenFor(modelItem => modelItem[i].ID_agent)
   @Html.RadioButtonFor(modelItem => modelItem[i].SelectedAgent, modelItem[i].ID_agent)           

   @Html.DisplayFor(modelItem => modelItem[i].nom_agent) 
   @Html.DisplayFor(modelItem => modelItem[i].prenom_agent)           
    <br />           

}

Note that you would need your view to be typed with IList<> or an array to allow this behavior.