我已经在网上进行过研究,但希望有人可以帮助我。
我有以下ViewModel类:
public class PersonEditViewModel
{
public Person Person { get; set; }
public List<DictionaryRootViewModel> Interests { get; set; }
}
public class DictionaryRootViewModel
{
public long Id { get; set; }
public string Name { get; set; }
public ICollection<DictionaryItemViewModel> Items;
public DictionaryRootViewModel()
{
Items = new List<DictionaryItemViewModel>();
}
}
public class DictionaryItemViewModel
{
public long Id { get; set; }
public string Name { get; set; }
public bool Selected { get; set; }
}
在编辑视图中,我使用自定义EditorTemplate来使用@Html.EditorFor(m => m.Interests)
布局兴趣集合。有两个EditorTemplates进行渲染:
DictionaryRootViewModel.cshtml:
@model Platforma.Models.DictionaryRootViewModel
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Name)
@Html.EditorFor(model => model.Items)
DictionaryItemViewModel.cshtml:
@model Platforma.Models.DictionaryItemViewModel
@Html.HiddenFor(model => model.Id)
@Html.CheckBoxFor(model => model.Selected)
@Html.EditorFor(model => model.Name)
问题:
使用POST提交表单时,只会填充Interests
集合,Interest.Items
集合始终为空。
该请求包含(以及其他)以下字段名称,它们在检查控制器操作方法中的Request.Forms数据时也存在。
所有包含正确的值 - 但在控制器端,方法中的对象pvm:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PersonEditViewModel pvm)
{
}
包含Interests集合中的数据(具有正确ID和名称的项目),但对于集合的每个元素,其“子集合”项目为空。
如何正确选择模型?
答案 0 :(得分:1)
public List<DictionaryItemViewModel> Items
的 {获得;设置;} 强>
答案 1 :(得分:0)
大部分时间问题都是索引,当您有集合发布时,您需要拥有顺序索引或者如果索引不是连续的,则需要Interests [i] .Items.Index隐藏字段。
Here is similar question on SO
如果你有
,它将不Interests[0].Id
Interests[0].Name
Interests[0].Items[0].Id
Interests[0].Items[0].Selected
Interests[0].Items[2].Id
Interests[0].Items[2].Selected
所以要修复它,要么确保将序列索引作为
Interests[0].Id
Interests[0].Name
Interests[0].Items[0].Id
Interests[0].Items[0].Selected
Interests[0].Items[1].Id
Interests[0].Items[1].Selected
或强>
Interests[0].Id
Interests[0].Name
Interests[0].Items.Index = 0 (hidden field)
Interests[0].Items[0].Id
Interests[0].Items[0].Selected
Interests[0].Items.Index = 2 (hidden field)
Interests[0].Items[2].Id
Interests[0].Items[2].Selected