【问题标题】:MVC parent child kind of model form submit doesn't send child collection to controllerMVC父子类型的模型表单提交不会将子集合发送到控制器
【发布时间】:2016-08-28 20:55:43
【问题描述】:

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

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

    public List<EmployeeModel> Managers { get; set; }
}

以及下面的Employee模型

public class EmployeeModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
}

我的父视图如下所示

@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>            
}

以及下图的局部视图

@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>

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

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);
}

当点击提交按钮时,任何人都可以帮助我如何发送子列表对象以及父类的一些属性。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 form-submit


    【解决方案1】:

    除非您传递HtmlFieldPrefix(请参阅this answer 的示例),否则您不能使用partial 为集合生成控件。然而,正确的做法是使用EditorTemplate。将您的部分重命名为 EmployeeModel.cshtml(即与类的名称匹配)并将其移动到 /Views/Shared/EditorTemplates 文件夹(或 /Views/YourControllerName/EditorTemplates 文件夹)。

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

    @Html.EditorFor(m => m.Managers)
    

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

    <input ... name="Managers[0].Name" />
    <input ... name="Managers[1].Name" />
    

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

    【讨论】:

    • 谢谢斯蒂芬,我尝试了你的建议,但不知何故 html 没有正确呈现。我不知道如何在 cmets 部分插入图像,我拍摄了它渲染的快照,并用我的 DevelperTools 向您展示。
    • 什么没有正确渲染?我向您展示的解决方案效果很好。
    • 跨度>
  • 以上是在主视图中将循环更改为@Html.EditorFor(m => m.Managers)
  • 什么?你在哪里甚至没有&lt;li&gt; 元素。而且您使用Guid 生成Managers.Index 的事实表明您可能正在使用BeginCollectionItem,您在问题或代码中根本没有提到。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签