2014-08-29 3 views
0

У меня есть viewmodel внутри другой viewmodel для разделения проблем. Я создал для него шаблон редактора и установил значения по умолчанию в контроллере во время выполнения. К сожалению, когда модель родительского представления отправляется в контроллер, она не сохраняет значения элементов моделей дочерних элементов. Вот код:ViewModel внутри ViewModel - как его разместить?

Примечание: Некоторые кодовые названия были изменены, поэтому, если есть какие-либо несоответствия, укажите это в комментарии. Я просмотрел его примерно в 4 раза и нашел все, что думаю.

public class ParentViewModel { 
    public ChildViewModel {get;set;} 
} 
public class ChildViewModel { 
    public List<Item> Items {get;set;} 
} 
public class Item { 
    public int Id {get;set; 
    public string Name {get;set;} 
} 

Я создал EditorTemplate, который связывает должным образом на представлении

@model MyProject.ViewModels.ChildViewModel 

@foreach (var item in Model.Items) 
{ 
    <div class="Item" @String.Format("id=Item{0}", @item.Id) > 
     Item #@Html.DisplayFor(models => item.Id): 
     @Html.LabelFor(model => item.Name) 
     @Html.EditorFor(model => item.Name) 
    </div> 
} 

Однако, когда я отправить форму, что ParentViewModel привязан к, элементы в ChildViewModel являются нуль!

Controller.cs

public class ControllerController{ 
    public ActionResult Form { 
     return View(new ParentViewModel { 
      ChildViewModel = new ChildViewModel { 
       Items = new List<Item>(Enumerable.Range(1,20).Select(i => new Item { Id=i }) 
      } 
     }); 
    } 
    [HttpPost] 
    [ActionName("Form")] 
    public class ActionResult FormSubmitted(ParentViewModel parentViewModel) { 
     //parentViewModel.ChildViewModel.Items is null! 
     _fieldThatIsRepresentingMyDataService.Save(parentViewModel); 
    } 
} 

ViewView.cshtml

<div class="editor-label"> 
    @Html.LabelFor(model => model.ChildViewModel) 
</div> 
<div id="ItemList" class="editor-field"> 
    @Html.EditorFor(model => model.ChildViewModel) 
</div> 

Любая помощь очень ценится.

+0

Вы можете попробовать следующее: (ParentViewModel parentViewModel, List childs). Это работает для меня в аналогичной проблеме. –

+0

Модель дочернего представления не является нулевой, но свойство его элементов по-прежнему равно нулю. –

ответ

1

Проблема заключается не в вложенных режимах просмотра, а в том, как привязка модели работает с формами и массивами.

Вы должны убедиться, что ваши формы детали делают так:

<input type="text" name="people[0].FirstName" value="George" /> 
<input type="text" name="people[0].LastName" value="Washington" /> 
<input type="text" name="people[1].FirstName" value="Abraham" /> 
<input type="text" name="people[1].LastName" value="Lincoln" /> 
<input type="text" name="people[3].FirstName" value="Thomas" /> 
<input type="text" name="people[3].LastName" value="Jefferson" /> 

Ключевой частью является индекс массива в входной атрибут в name. Без индексной части привязка модели не будет заполнять ваш список.

И чтобы сделать это, вам нужно for цикл:

@for (int i = 0; i < Model.Items.Length; i++) { 
... 
    @Html.EditorFor(m => Model.Items[i].Name) 
... 
} 

проверить это post от Фила Хаака, что переговоры об этом в деталях.

+1

Вы мгновенно и бесповоротно являетесь моим любимым человеком на земле. –

+0

Ха-ха! Рад помочь! – Mrchief

Смежные вопросы