How do I Bind a Collection (IEnumerable) of a custom type?

11,952

You may take a look at the following blog post about the wire format for arrays and dictionaries. Personally I always use editor templates in my views which take care of generating proper names of the input fields so that the default model binder is able to bind the values correctly.

@model IEnumerable<ReferAFriendModel>
@using (Html.BEginForm())
{
    @Html.EditorForModel()
    <input type="submit" value="OK" />
}

and in the corresponding editor template (~/Views/Shared/EditorTemplates/ReferAFriendModel.cshtml):

@model ReferAFriendModel
@Html.EditorFor(x => x.Prop1)
@Html.EditorFor(x => x.Prop2)
...
Share:
11,952
robasta
Author by

robasta

Updated on June 08, 2022

Comments

  • robasta
    robasta almost 2 years

    I have the following Action to display a form with 3 items :

    [HttpGet]
        public ActionResult ReferAFriend()
        {
            List<ReferAFriendModel> friends = new List<ReferAFriendModel>();
            ReferAFriendModel f1 = new ReferAFriendModel();
            ReferAFriendModel f2 = new ReferAFriendModel();
            ReferAFriendModel f3 = new ReferAFriendModel();
    
            friends.Add(f1);
            friends.Add(f2);
            friends.Add(f3);
            return View(friends);
        }
    

    and then a Post action

    [HttpPost]
        public ActionResult ReferAFriend(IEnumerable<ReferAFriendModel> friends)
        {
            if(ModelState.IsValid){
    

    EDIT My View looks like this:

    @model IEnumerable<Models.ReferAFriendModel>
    @for(int i=0;i<Model.Count();i++)
        {
            @Html.Partial("_ReferAFriend", Model.ElementAt(i));
        }
    

    The partial looks like this:

    @model Models.ReferAFriendModel
    <p>
       @Html.LabelFor(i => i.FullName) @Html.TextBoxFor(i => i.FullName)<br />
       @Html.LabelFor(i => i.EmailAddress) @Html.TextBoxFor(i => i.EmailAddress)
       @Html.HiddenFor(i=>i.Id)
    </p>
    

    When I post, I can see the fields are posted in the Request.Form object e.g Request.Form["FullName"] will show: "David Beckham","Thierry Henry". "Chicharito Fergurson" which are the values I entered in the form. But, the in the Post action,the value for 'friends' is always null. The ReferAFriendModel has three public properties Id, EmailAddress and FullName.

    What am I doing wrong?

  • robasta
    robasta almost 13 years
    Just what I wanted, I was using an MVC2 tutorial which led me on the wrong path. Thanks