Skip to main content
 首页 » 编程设计

c#之发布到 Controller 时填充 subview 模型集合

2024年02月23日34zhujiabin

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

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 功能。当我发布表单时,我的 View 如下所示:

<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" /> 

还有我的 Controller 方法:

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

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

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

我在这里做错了什么?

我正在使用 MVC 3 和 Razor。

请您参考如下方法:

我可能是错的,但我是这样处理的。

创建一个局部 View 以显示所有员工。 创建局部 View 以显示单个员工。

将员工模型传递给员工分部 View ,该分部 View 依次循环并为每个员工呈现员工分部 View 。

然后在运行时,当用户添加员工时,我使用 jQuery ajax 回发到 Controller 。

Controller 添加员工并返回呈现的员工部分控制。

ajax 调用成功,然后(附加)新员工部分 View html 到已经存在的员工列表中。

我的 View 采用包含公司和 List<Employee> 的表单 View 模型

编辑

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

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

编辑2

删除员工姓名上的编号。然后在您的 Controller 中,您可以使用以下内容

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

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