Opti" /> Opti" /> Opti"/>

MVC -> Binding to Collections of Custom Types

307 Views Asked by At

Property, from which of set of hidden fields are to be populated:

public abstract class MyPageView
{        
    [UIHint("List")]
    public IEnumerable<IOption> OptionList { get; set; }
}

Command to do so:

@Html.EditorFor(m => m.OptionList)

Implementation of defined 'List' template:

@model IEnumerable<RoomWanted.FlatShare.Services.ViewModels.Options.IOption>

@for (int i = 0; i < Model.Count(); i++)
{    
    @Html.HiddenFor(x => Model.ToList()[i].Id)
    @Html.HiddenFor(x => Model.ToList()[i].Name)
}

What I GET generated:

<input id="OptionList__0__Id" name="OptionList.[0].Id" type="hidden" value="1" />
<input id="OptionList__0__Name" name="OptionList.[0].Name" type="hidden" value="New York" />

What I NEED TO GET generated, so that model binding works correctly:

<input id="OptionList_0__Id" name="OptionList[0].Id" type="hidden" value="5"></input>
<input id="OptionList_0__Name" name="OptionList[0].Name" type="hidden" value="New York"></input>

Any Ideas on how to get rid of that dot so i have OptionList[0].Id instead of OptionList.[0].Id ?

Cheers.

1

There are 1 best solutions below

1
Darin Dimitrov On

Use an IList<IOption> or IOption[] instead:

public abstract class MyPageView
{        
    [UIHint("List")]
    public IList<IOption> OptionList { get; set; }
}

and then in your view:

@model IList<RoomWanted.FlatShare.Services.ViewModels.Options.IOption>

@for (int i = 0; i < Model.Count; i++)
{    
    @Html.HiddenFor(x => x[i].Id)
    @Html.HiddenFor(x => x[i].Name)
}