我已经研究了整个网络,但希望这里有人能帮助我。
我有以下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)
来布局"兴趣"集合。有两个编辑器模板可以进行渲染:
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数据时也会出现这些字段名。
- 兴趣[0].Id
- 兴趣[0]。名称
- 兴趣[0]。项目[0]。Id
- 兴趣[0]。项目[0]。已选择
所有值都包含正确的值,但在控制器端,方法中的对象pvm:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PersonEditViewModel pvm)
{
}
包含Interest集合中的数据(具有正确id和名称的项),但对于集合的每个元素,其"项的子集合"为空。
如何正确选择模型?
和往常一样,答案一直摆在我面前。DefaultModelBinder没有获取请求中传递的Items值,因为我"忘记"将Items集合标记为属性——它是一个字段!考虑到@pjobs:有用备注的正确表格
public List<DictionaryItemViewModel> Items
{get;set;}
大多数情况下,问题都与索引有关,当您发布集合时,您要么需要有顺序索引,要么需要有Interests[i].Items.index隐藏字段(如果索引不是顺序的)。
这是关于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