MVC 父子类型模型表单提交不会将子集合发送到控制器

Bha*_*kar 3 asp.net-mvc form-submit asp.net-mvc-4

我有一个公司模型,它有员工列表模型,如下所示

public class Company
{
    [Required]
    [Display(Name = "Company Name")]
    public string Name { get; set; }

    public List<EmployeeModel> Managers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和 Employee 模型如下

public class EmployeeModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的父视图如下所示

@using (Html.BeginForm("CompanySignupSuccess", "Home", FormMethod.Post, new { @class = "horizontal-form", role = "form", enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div>
        <div class="form-group">
            @Html.LabelFor(m => m.Name, new { @class = "control-label" })<span class="required">*</span>
            @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
        </div>

        <div class="form-group">
            <label for="file">Logo:</label>
            <input type="file" name="logo" id="logo"                    accept=".png,.jpg,.jpeg" /> 

        </div>
        <div id="managerList">

            <div id="editorRowsManagers">
                @foreach (var item in Model.Managers)
                {
                    @Html.Partial("DetailsView", item)
                }
            </div>

        </div>

        <div class="form-group">
            <input type="submit" class="btn btn-default pull-right" value="Send" />
        </div>
    </div>            
}
Run Code Online (Sandbox Code Playgroud)

和如下所示的部分视图

@model yourAssembly.EmployeeModel
<div style="border:1px solid;margin:20px; padding:10px;">
    Manager Details:
    <div class="form-group">
        @Html.LabelFor(m => m.Name, new { @class = "control-label" })
        @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "control-label" }) <span class="required">*</span>
        @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Phone, new { @class = "control-label" }) <span class="required">*</span>
        @Html.TextBoxFor(m => m.Phone, new { @class = "form-control phoneno" })
    </div>

</div>
Run Code Online (Sandbox Code Playgroud)

当我单击“提交”按钮时,转到控制器的模型仅填充了“名称”和“徽标”属性,并且列表对象(管理器)为空,因此我不确定这里缺少什么。顺便说一句,我使用了员工列表,因为我想通过“添加”按钮添加更多员工,而“添加”按钮只会呈现另一个部分视图。

public ActionResult CompanySignupSuccess(Company model)
{
    if (ModelState.IsValid)
    {
         //do some process
    }
    else
    {
        ModelState.AddModelError("", "Invalid Data entered.");
    }
    // If we got this far, something failed, redisplay form
    return View("CompanySignup", Model);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我了解如何在单击“提交”按钮时发送子列表对象以及父类的一些属性。

小智 6

HtmlFieldPrefix除非您通过(请参阅此答案以获取示例),否则您不能使用部分为集合生成控件。然而,正确的方法是使用EditorTemplate. 将您的部分重命名为EmployeeModel.cshtml(即匹配类的名称)并将其移动到/Views/Shared/EditorTemplates文件夹(或/Views/YourControllerName/EditorTemplates文件夹)。

然后将视图中的循环替换为

@Html.EditorFor(m => m.Managers)
Run Code Online (Sandbox Code Playgroud)

这将正确生成name绑定所需的属性,即

<input ... name="Managers[0].Name" />
<input ... name="Managers[1].Name" />
Run Code Online (Sandbox Code Playgroud)

等(目前您生成的所有属性都是重复name属性(并且重复id属性是无效的html)