MVC 父子类型的模型表单提交不会将子集合发送到控制器
MVC parent child kind of model form submit doesn't send child collection to controller
我有一个公司模型,它有员工列表模型,如下所示
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>
当我单击提交按钮时,转到控制器的模型确实只填充了名称和徽标属性,并且列表对象 (Managers) 为空,所以我不确定我在这里缺少什么。顺便说一句,我使用了 employees 列表,因为我想通过 'Add' 按钮添加更多员工,而 Add 按钮只会呈现另一个局部视图。
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);
}
任何人都可以帮助我了解如何在点击提交按钮时发送子列表对象以及父 class 上的一些属性。
除非您通过 HtmlFieldPrefix
(请参阅 以获取示例),否则您不能使用部分来为集合生成控件。然而,正确的做法是使用 EditorTemplate
。将您的部分重命名为 EmployeeModel.cshtml
(即匹配 class 的名称)并将其移动到 /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)
我有一个公司模型,它有员工列表模型,如下所示
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>
当我单击提交按钮时,转到控制器的模型确实只填充了名称和徽标属性,并且列表对象 (Managers) 为空,所以我不确定我在这里缺少什么。顺便说一句,我使用了 employees 列表,因为我想通过 'Add' 按钮添加更多员工,而 Add 按钮只会呈现另一个局部视图。
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);
}
任何人都可以帮助我了解如何在点击提交按钮时发送子列表对象以及父 class 上的一些属性。
除非您通过 HtmlFieldPrefix
(请参阅 EditorTemplate
。将您的部分重命名为 EmployeeModel.cshtml
(即匹配 class 的名称)并将其移动到 /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)