问题描述
我有带有嵌套集合的视图模型。我想通过ajax发布该表单,但我无法正确序列化它。这是我的看法
@model ARM.Presentation.viewmodels.SecurityFormProfileviewmodel
@{
ViewData["Title"] = "EditSecurityProfile";
}
<hr />
<div class="offset-1 row">
<div class="col-md-12">
<form asp-action="EditSecurityProfile" autocomplete="chrome-off" method="post" id="security-
profiles-form">
<div class="form-row">
<div class="form-group">
<input asp-for="ProfileId" type="hidden" class="form-control" />
</div>
<div class="offset-2 col-md-2">
<h3>@Model.ProfileName</h3>
</div>
<div class="col-md-2">
<h5>Select Area to Filter Items</h5>
<select id="areaid" class="form-control" asp-items="@Model.MainAreasList">
</select>
</div>
</div>
<div class="form-row mt-2">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="col-md-6">
<div class="form-group">
<vc:security-form profile-id="@Model.ProfileId" area-id="null"></vc:security-form>
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-2">
<arm-submitbtn id="formprofilesubmit"></arm-submitbtn>
<arm-cancelbtn id="formprofilecancel"></arm-cancelbtn>
</div>
</div>
</form>
</div>
</div>
<div class="offset-2 col-12">
<vc:users-by-security-profile profile-id="@Model.ProfileId"></vc:users-by-security-profile>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
<script src="~/js/Areas/Administration/Views/SecurityProfiles/SecurityProfiles.js"></script>
<script src="~/js/Areas/Administration//Views/SecurityProfiles/SecurityProfilesService.js">
</script>
}
这是我在上述视图中调用的视图组件。
@model SecurityFormProfileviewmodel
<div id="forms">
<table class="table">
<thead>
<tr>
<td></td>
<td>Form Name</td>
<td></td>
<td></td>
<td></td>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.SecurityForms.Count; i++)
{
<tr>
<td>
<input type="hidden" asp-for="@Model.SecurityForms[i].FormId" />
<input type="hidden" asp-for="@Model.SecurityForms[i].AreaId" />
</td>
<td>
<label class="form-check-label">@Model.SecurityForms[i].FormName</label>
</td>
@foreach (var item in Model.SecurityForms[i].AccessLevels)
{
<td>
<div class="form-check form-check-inline">
<input class="form-check-input" asp-for="@Model.SecurityForms[i].SelectedAccessLevelId" type="radio" id="inlineRaio1"
value="@item.AccesstypeId">
<label class="form-check-label">@item.Accesstype</label>
</div>
</td>
}
</tr>
}
</tbody>
</table>
</div>
对于以上所有内容,我使用具有嵌套集合的视图模型。这是我想要使用 jquery 从视图序列化的视图模型。
public class SecurityFormProfileviewmodel
{
public int ProfileId { get; set; }
public string ProfileName { get; set; }
public List<SecurityFormviewmodel> SecurityForms { get; set; }
public IEnumerable<SelectListItem> MainAreasList { get; set; }
}
解决方法
首先,为什么要使用组件作为表单的一部分?通常组件用于跨页面重用一些通用功能。它们的视图可以包含表单,但我认为它们不能成为父表单的一部分。如果你想在一个表单中重用一些 .cshtml 代码可能是局部视图是一个更好的方法?在这种情况下,列表 SecurityForms
将为 null,因为当将表单绑定到模型时,框架不知道来自组件视图的数据属于属性 SecurityForms
,即它无法绑定来自表单数据。解决这个问题的最简单方法是用局部视图替换组件并添加一个名为 SecurityForms
的前缀,这样在发布后 MVC 框架就会知道来自局部视图的数据属于属性 {{1} } 此处有更多相关信息getting the values from a nested complex object that is passed to a partial view