我有一个页面,您可以在其中添加公司。一家公司有多名员工。以下是我的观点模型:
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。
答案 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)