在发送到控制器时填充子视图模型集合
本文关键字:视图 模型 集合 填充 控制器 | 更新日期: 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)