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

时间:2015-04-22 13:37:56

标签: c# asp.net-mvc razor defaultmodelbinder

我已经在网上进行过研究,但希望有人可以帮助我。

我有以下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进行渲染:

  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)
    
  3. 问题:

    使用POST提交表单时,只会填充Interests集合,Interest.Items集合始终为空。 该请求包含(以及其他)以下字段名称,它们在检查控制器操作方法中的Request.Forms数据时也存在。

    • 兴趣[0] .Id
    • 兴趣[0] .Name
    • 兴趣[0] .Items [0] .ID
    • 兴趣[0] .Items [0] .Selected

    所有包含正确的值 - 但在控制器端,方法中的对象pvm:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(PersonEditViewModel pvm)
    {
    }
    

    包含Interests集合中的数据(具有正确ID和名称的项目),但对于集合的每个元素,其“子集合”项目为空。

    如何正确选择模型?

2 个答案:

答案 0 :(得分:1)

像往常一样 - 答案始终摆在我面前。 DefaultModelBinder没有获取请求中传递的Items值,因为我“忘记”将Items集合标记为属性 - 它是一个字段! 正确的形式考虑了@pjobs的有用评论:

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