【问题标题】:Populate child view model collection when posting to controller发布到控制器时填充子视图模型集合
【发布时间】:2011-08-28 23:29:25
【问题描述】:

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

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。

【问题讨论】:

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


【解决方案1】:

我可能错了,但这是我的处理方式。

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

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

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

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

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

我的视图采用包含公司的 formviewmodel 和 List&lt;Employee&gt;

编辑

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

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

编辑 2

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

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

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

【讨论】:

  • 在这种情况下如何使用 Bind?我不太确定它是如何工作的。
  • 我也不确定,但绑定允许您为控件指定命名空间并在其上绑定。在你的情况下,我认为是员工。
  • 还有一件事,我认为您需要将名称保留为 Employee.FirstName 和 Employee.LastName 而没有 [x]
【解决方案2】:

我建议这样做

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

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

【讨论】:

    【解决方案3】:

    你可以试试下面的说法吗

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多