具有列表到控制器的MVC POST模型

时间:2016-01-28 17:04:46

标签: asp.net-mvc

考虑这两个视图模型

public class PersonViewModel
{
    public int PersonId { get; set; }
    public string PersonName { get; set; }
    public int PersonAge {get; set;}

    public virtual PersonJobSplitViewModel JobSplit { get; set; } // hold each split
    public virtual List<PersonJobSplitViewModel> JobSplits { get; set; } //contain all splits
}

public class PersonJobSplitViewModel
{
    public int PersonJobSplitId { get; set; }
    public int PersonId { get; set; }
    public string JobRole { get; set; }
    public decimal SplitPercentage { get; set; }
    public virtual PersonViewModel PersonViewModel { get; set; }
}

每个人可以有1-3个工作岗位。

我有一个绑定到PersonViewModel的创建视图,在我的控制器的GET方法中,我正在创建一个容量为3的List<PersonJobSplitViewModel>实例,并将其分配给PersonViewModel.JobSplits < / p>

@model MySolution.Web.ViewModels.PersonViewModel

...

@for (var i = 0; i < Model.JobSplits.Capacity; i++)
{
    @Html.EditorFor(model => model.JobSplit.JobRole);
    @Html.EditorFor(model => model.JobSplit.SplitPercentage);
}

这会导致角色和百分比输入呈现给视图3次。我的POST方法期待PersonViewModelPersonViewModel.JobSplits正在nullJobSplit属性包含我的3个分裂中的一个,正如我所期望的那样。

那么如何将与其完整的JobSplits列表绑定的模型发布到控制器?

我发现以前已经回答过类似的事情,但我似乎无法找到与 MVC5 相关的直接解决方案,并且涉及将列表标记为大型模型,因为它只是传递控制器列表。

更新

我现在尝试执行以下操作

@for (var i = 0; i < Model.JobSplits.Capacity; i++)
{
    @Html.EditorFor(model => model.JobSplits[i].JobRole);
    @Html.EditorFor(model => model.JobSplits[i].SplitPercentage);
}

但我明白了:

  

指数超出范围。必须是非负数且小于   集合。参数名称:index

1 个答案:

答案 0 :(得分:0)

发布后直接解决了这个问题。

<强>控制器

//Prep view Model
PersonViewModel viewModel = new PersonViewModel();
List<PersonJobSplitViewModel> instantiatedSplitCount = new List<PersonJobSplitViewModel>(3);

for (int i = 0; i < 3; i++)
{
    instantiatedSplitCount.Add(null);
}

viewModel.JobSplits = instantiatedSplitCount;
return View(viewModel);

查看

@for (var i = 0; i < Model.JobSplits.Count(); i++)
{
    @Html.EditorFor(model => model.JobSplits[i].JobRole);
    @Html.EditorFor(model => model.JobSplits[i].SplitPercentage);
}

似乎检查容量是问题,在我通过之前将3个空值分配给列表,然后检查计数是解决方案。

在我的控制器中并不漂亮,但如果其他人可以建议更多语法解决方案,请分享。