I've done this several times and have used Phil Haack's post as a guide. This last time I figured out how to make it work with Editor Templates. Posting this here in hopes it helps someone else down the road (or me if I ever forget).
My example here is using Addresses (using only one property out for brevity).
AddressViewModel.cs
public class AddressViewModel
{
public string Address1 { get; set; }
}
AddressViewModels.cs
public class AddressViewModels : List<AddressViewModel>
{
}
PersonViewModel.cs
public class PersonViewModel
{
public AddressViewModels HomeAddresses { get; set; }
}
AddressViewModel.cshtml (Editor Template)
@model AddressViewModel
<div>
@Html.LabelFor(m => m.Address1)
@Html.TextBoxFor(m => m.Address1)
</div>
AddressViewModels.cshtml (Editor Template)
@model AddressViewModels
@for (var i = 0; i < Model.Count; i++)
{
@Html.Hidden("Index", i)
@Html.EditorFor(m => Model[i])
}
Person.cshtml
@model Person
<h3>Edit Addresses</h3>
@Html.EditorFor(m => m.HomeAddresses)
<button type="submit">Save</button>
Rendered HTML
<input id="HomeAddresses_Index" name="HomeAddresses.Index" type="hidden" value="0">
<label for="HomeAddresses_1__Address1">Address 1</label>
<input id="HomeAddresses_1__Address1" name="HomeAddresses[1].Address1" type="text" value="P.O.Box 123" >
<button type="submit">Save</button>