ViewModel内部的ViewModel-如何将其发布
本文关键字:内部 ViewModel- ViewModel | 更新日期: 2023-09-27 18:19:57
我在另一个视图模型中有一个用于分离关注点的视图模型。我为它创建了一个编辑器模板,并在运行时在控制器中设置默认值。不幸的是,当父视图模型发布到控制器时,它不会保存子视图模型项的值。这是代码:
注意:有些代码名称被更改了,所以如果有任何不一致之处,请在评论中指出。我看了大约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的项为null!
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>
非常感谢您的帮助。
问题不在于嵌套的视图模型,而在于模型绑定与窗体和数组的工作方式。
您需要确保您的表单项呈现如下:
<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)
...
}
看看Phil Haack的这篇文章,详细介绍一下。