Используйте шаблон редактора, в большинстве случаев он лучше подходит для рендеринга дочерних объектов или коллекций. В папке Views \ Shared создайте новую папку с именем EditorTemplates, если у вас ее еще нет. Добавьте новое частичное представление с именем EggViewModel и используйте тот же код, что и в вашем частичном представлении. Это та магия, которая правильно отображает и называет все ваши поля. Он также будет обрабатывать коллекцию EggViewModels без каждого цикла, поскольку шаблон редактора автоматически отобразит все элементы, переданные в коллекции:
@model MvcApplication1.ViewModels.EggViewModel
<h2>Egg</h2>
<p>
@Html.LabelFor(model => model.Size)
@Html.EditorFor(model => model.Size)
</p>
<p>
@Html.LabelFor(model => model.IsBroken)
@Html.CheckBoxFor(model => model.IsBroken)
</p>
Затем в вашем демонстрационном представлении используйте новый шаблон редактора вместо частичного:
<p>
@Html.EditorFor(x => x.Egg)
</p>
Здесь - это поля, которые отображаются:
![Rendered fields](https://i.stack.imgur.com/V8qlD.jpg)
В сообщении вы можете сказать, что EggViewModel теперь является частью EggBoxViewModel:
![](https://i.stack.imgur.com/uoktI.jpg)
Также в ModelState вы можете видеть, что поля Egg имеют префикс имени свойства, используемого в EggBoxViewModel, что делает их подмножеством EggBox.
![](https://i.stack.imgur.com/qwGTX.jpg)
И ... замечательно, что если вы хотите иметь коллекцию Eggs в своем EggBox, это действительно просто ... просто сделайте свое свойство Egg в EggBoxViewModel коллекцией:
public class EggBoxViewModel
{
public string Brand { get; set; }
public int Price { get; set; }
public ICollection<EggViewModel> Eggs { get; set; }
}
Добавьте второе яйцо:
public ActionResult Demo()
{
EggBoxViewModel eggBox = new EggBoxViewModel();
eggBox.Brand = "HappyEggs";
eggBox.Price = 3;
EggViewModel egg = new EggViewModel();
egg.Size = "Large";
egg.IsBroken = false;
EggViewModel egg2 = new EggViewModel();
egg2.Size = "Medium";
egg2.IsBroken = false;
eggBox.Eggs = new List<EggViewModel>();
eggBox.Eggs.Add(egg);
eggBox.Eggs.Add(egg2);
return View(eggBox);
}
Измените ваше представление для отображения x.Eggs вместо x.Egg:
<p>
@Html.EditorFor(x => x.Eggs)
</p>
Затем в ответном сообщении вы увидите, что отправлено 2 яйца:
![enter image description here](https://i.stack.imgur.com/1suNp.jpg)
Имена полей были автоматически проиндексированы и названы для создания коллекции яиц:
![enter image description here](https://i.stack.imgur.com/o8Dpp.jpg)