强类型列表从View返回填充模型?

时间:2013-08-23 13:20:59

标签: c# asp.net-mvc-4 razor

我正在尝试传递数据,并且在使用强类型数据时遇到问题。

所有目标都是:

  • 索引:所有员工的复选框列表。表中的组,按工作地址分隔(通过foreach(字符串地址)+ foreach(员工e,其中e.Where(地址)有点魔法。

  • 报告详情。此部分应显示所选用户列表,询问一些小时和标题。很简单。

  • 完成并显示。此部分应将数据插入数据库并呈现pdf。

这是我希望员工的数据所在的类。我在那里删除了方法,以便缩短它:

public class IndexModel
{
    public List<EmployeeForList> Employees { get; set; }

    public class EmployeeForList
    {
        public bool IsChecked { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int EmployeeId { get; set; }
        public string Building { get; set; }

        public EmployeeForList()
        {
        }

        public EmployeeForList(TXEP.InfoWeb employee)
        {

            this.FirstName = employee.FirstName;
            this.IsChecked = false;
            this.LastName = employee.LastName;
            this.Building = employee.BuildingAddress;
            this.EmployeeId = employee.EmployeeId;
        }
    }
}

以下是视图代码:

@using (@Html.BeginForm("TrainingDetail", "Home", FormMethod.Post))
{
<table border="1">
    @foreach (string building in Model.GetUniqueBuildings())
    {
        <tr>
        @foreach (var employee in Model.GetEmployeesFromBuilding(building))
        {
            <td>
                @Html.CheckBoxFor(model => @Model.GetEmployee(employee).IsChecked)
                @Html.HiddenFor(model => @Model.GetEmployee(employee).LastName)
                @Html.HiddenFor(model => @Model.GetEmployee(employee).FirstName)
                @Html.HiddenFor(model => @Model.GetEmployee(employee).EmployeeId)
                @Html.HiddenFor(model => @Model.GetEmployee(employee).Building)
                @employee.LastName, @employee.FirstName
            </td>
        }
        </tr>
    }
</table>
    <input type="submit" value="sub" />  
}

我期待它返回上面的模型。相反,它返回一个空的Employee列表。我确定我错过了一些愚蠢的东西,但我无法理解。

接收端的控制器如下所示:

    public ActionResult TrainingDetail(Models.IndexModel indexModel)
    {
        if (indexModel.Employees == null)
        {
            ViewBag.Message = "EMPTY FOO";
            return View();
        }
        int count = indexModel.Employees.Where(x => x.IsChecked == true).Count();
        ViewBag.Message = count.ToString();

        return View();
    }

我怀疑我未能掌握的是如何在视图中创建一个Employee,以便填充强类型列表。或者我完全误解了这些概念?

它似乎完全围绕着一个列表,因为我可以轻松地传递简单的数据 - 但是当我得到它时这个列表是空的,但是我的Google-fu失败了我所以我恳求你,我的兄弟们,帮助

1 个答案:

答案 0 :(得分:3)

我相信在模型绑定期间水合一个实体列表实体属性的名称需要以这样的索引为前缀:

@Html.CheckBoxFor(model => model.Employees[0].IsChecked)
@Html.HiddenFor(model => model.Employees[0].LastName)
@Html.HiddenFor(model => model.Employees[0].FirstName)
@Html.HiddenFor(model => model.Employees[0].EmployeeId)
@Html.HiddenFor(model => model.Employees[0].Building)

MVC知道如何创建新的EmployeeForList实体并将其添加到Employees列表。

注意: model此处为IndexModel