在发送到控制器时填充子视图模型集合

本文关键字:视图 模型 集合 填充 控制器 | 更新日期: 2023-09-27 18:06:48

我有一个可以添加公司的页面。一个公司有多个雇员。以下是我的视图模型:

public class CompanyViewModel
{
    [ScaffoldColumn(false)]
    public int CompanyId { get; set; }
    public string Name{ get; set; }
    public List<EmployeeViewModel> Employees { get; set; }
}
public class EmployeeViewModel
{
    [ScaffoldColumn(false)]
    public int EmployeeId { get; set; }
    public int CompanyId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在我的页面上,我有jQuery功能来动态添加/删除员工。当我发布我的表单时,我的视图看起来像这样:

<input id="CompanyId" name="CompanyId" type="hidden" value="0" />
<input id="Name" name="Name" type="text" value="Test company name" />
<input id="Employees[1].FirstName" name="Employees[1].FirstName" type="text" value="fn1" />
<input id="Employees[1].LastName" name="Employees[1].LastName" type="text" value="ln1" />
<input id="Employees[2].FirstName" name="Employees[2].FirstName" type="text" value="fn2" />
<input id="Employees[2].LastName" name="Employees[2].LastName" type="text" value="ln2" />
<input id="Employees[3].FirstName" name="Employees[3].FirstName" type="text" value="fn3" />
<input id="Employees[3].LastName" name="Employees[3].LastName" type="text" value="ln3" />

控制器方法:

[HttpPost]
public ActionResult Create(CompanyViewModel viewModel)
{
    ...
}

当我在发布表单后通过调试器查看视图模型中的内容时,Employees集合为空。传递CompanyId和Name,但不传递Employees集合。

我还尝试将输入的id和名称从Employees[1].FirstName更改为Model.Employees[1].FirstName,但这也没有帮助。

我在这里做错了什么?

我使用MVC 3和Razor

在发送到控制器时填充子视图模型集合

我可能是错的,但这是我如何处理这个

创建一个局部视图来显示所有员工。创建一个局部视图来显示单个员工。

将雇员模型传递给雇员局部视图,该视图依次循环并呈现每个雇员的雇员局部视图。

,然后在运行时,当用户添加一个员工i post回控制器使用jQuery ajax。

控制器添加员工并返回呈现的employee部分控件。

ajax调用的成功将新员工的部分视图html添加到已经存在的员工列表中。

我的视图采用包含公司和List<Employee>的formviewmodel

编辑

然而,你可能会考虑在你的控制器中使用[bind]装饰器。

[Bind(Prefix="ContactDetails")] userDetail UserDetail

编辑2

删除员工姓名上的编号。然后在你的控制器中你可以使用下面的

[HttpPost]
public ActionResult Create(CompanyViewModel viewModel, [Bind(Prefix="Employees")] List<EmployeeViewModel> Employees)
{
    ...
}

这是我如何在另一个项目中使用类似的东西

我建议这样做

@Html.TextBoxFor(m => m.Employees[i].FirstName)

,然后检查生成的HTML,看看命名约定是否正确。它可能更像Employees__1_FirstName或类似的东西

可以试试下面的语句吗

@Html.HiddenFor(x => x.itemlist[i].Id)
@Html.DisplayFor(x => x.itemlist[i].Name)
@Html.DisplayFor(x => x.itemlist[i].Surname)