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

时间:2011-08-28 23:29:25

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我有一个页面,您可以在其中添加公司。一家公司有多名员工。以下是我的观点模型:

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功能来动态添加/删除Employees。当我发布表单时,我的视图如下:

<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。

3 个答案:

答案 0 :(得分:2)

我可能错了,但这就是我如何处理这个问题。

创建一个部分视图以显示所有员工。 创建部分视图以显示单个员工。

将员工模型传递给员工部分视图,然后循环浏览并为每个员工呈现员工部分视图。

然后在运行时,当用户添加一名员工时,我使用jQuery ajax将其发回给控制器。

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

ajax调用的成功然后(追加)新员工部分查看html到已经存在的员工列表。

我的观点采用包含公司的formviewmodel和List<Employee>

修改

但是,您可能会考虑使用控制器的[bind]装饰器。

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

编辑2

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

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

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

答案 1 :(得分:2)

我建议做

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

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

答案 2 :(得分:0)

您可以尝试以下语句

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