ASP.NET MVC5模型绑定器-绑定集合的集合时为Null



我已经研究了整个网络,但希望这里有人能帮助我。

我有以下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)来布局"兴趣"集合。有两个编辑器模板可以进行渲染:

  1. DictionaryRootViewModel.cshtml:

    @model Platforma.Models.DictionaryRootViewModel
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.Name)
    @Html.EditorFor(model => model.Items)
    
  2. 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

相关内容

  • 没有找到相关文章

最新更新