从对象中的集合中删除对象时,.net core 2.1 razor 页面视图无法正确更新
Posted
技术标签:
【中文标题】从对象中的集合中删除对象时,.net core 2.1 razor 页面视图无法正确更新【英文标题】:.net core 2.1 razor page view does not update correctly when remove object from collection in object 【发布时间】:2019-05-23 12:56:34 【问题描述】:下面是我在 pageModel 中的 get 处理程序
public async Task<ActionResult> OnGet(int? Id)
if (Id == null || Id == 0)
return NotFound();
MyContractPermission = _context.ContractPermission.Where(x => x.Id == Id).Include(c => c.BudgetAssignYears)
.FirstOrDefault();
if (MyContractPermission.BudgetAssignYears == null || MyContractPermission.BudgetAssignYears.Count == 0)
MyContractPermission.BudgetAssignYears = new List<BudgetAssignYear>();
YearList = new SelectList(SamfaEnums.Years);
return Page();
这是剃刀视图:
<form method="post">
@for (var i = 0; i < Model.MyContractPermission.BudgetAssignYears.Count; i++)
var j = i + 1;
<tr class="d-flex" budgetRow>
<td class="col-1">
<span class="persian-number">@j</span>
<input type="hidden" asp-for="MyContractPermission.BudgetAssignYears[i].ContractPermissionId" />
</td>
<td class="col-2">
@html.DropDownListFor(model => model.MyContractPermission.BudgetAssignYears[i].Year, SamfaEnums.Years.Select(s => new SelectListItem Text = s, Value = s, Selected = s == "1397" ? true : false ), new @class = "form-control", @yearSelect = "" )
<span class="text-danger" asp-validation-for="MyContractPermission.BudgetAssignYears[i].Year"></span>
</td>
<td class="col-2">
<select asp-for="MyContractPermission.BudgetAssignYears[i].BudgetType" class="form-control" asp-items="Html.GetEnumSelectList<BudgetType>()">
<option selected="selected" value="">choose one </option>
</select>
<span class="text-danger" asp-validation-for="MyContractPermission.BudgetAssignYears[i].BudgetType"></span>
</td>
<td class="col-2">
</td>
<td class="col-2">
</td>
<td class="col-2 in-center">
<input type="submit" value="delete" class="icon-red" asp-route-index="@i"
asp-page-handler="Delete"
onclick="return confirm('do you sure?');" />
</td>
</tr>
</form>
最后在我的页面模型中删除处理程序是这样的:
public async Task<IActionResult> OnPostDeleteAsync(int index)
if (!ModelState.IsValid)
return Page();
MyContractPermission.BudgetAssignYears
.Remove(MyContractPermission.BudgetAssignYears[index]);
YearList = new SelectList(SamfaEnums.Years);
return Page();
当我点击删除提交按钮时 Delete 页面模型中的处理程序已被调用,并且 BudgetAssignYears 属性中的对象已删除与提交的 index 匹配,但是在从处理程序中恢复后,只需删除最后一个对象。 我删除了第一个对象,但发布后,删除了最后一个对象。 在调试模式下,一切正常,索引中的对象被删除,但在视图中只删除最后一项。
【问题讨论】:
【参考方案1】:我注意到和你一样的问题。在删除行之前添加 modelstate.clear() 为我修复了它。 试试
public async Task<IActionResult> OnPostDeleteAsync(int index)
if (!ModelState.IsValid)
return Page();
ModelState.Clear();
MyContractPermission.BudgetAssignYears
.Remove(MyContractPermission.BudgetAssignYears[index]);
YearList = new SelectList(SamfaEnums.Years);
return Page();
“如果您从表单中获取模型,并且想要操作来自客户端表单的数据并将其写回视图,则需要调用 ModelState.Clear() 来清除 ModelState 值。” https://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object
【讨论】:
以上是关于从对象中的集合中删除对象时,.net core 2.1 razor 页面视图无法正确更新的主要内容,如果未能解决你的问题,请参考以下文章
在 Restkit 执行映射操作之前删除 Core data 中的现有对象