从对象中的集合中删除对象时,.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 页面视图无法正确更新的主要内容,如果未能解决你的问题,请参考以下文章

如何从List集合中删除对象

在 Restkit 执行映射操作之前删除 Core data 中的现有对象

如何从 UWP(又名 .NET Core)中的 Type 对象获取程序集

从 Core Data 中删除对象和切换视图控制器时崩溃

从 Core Data 管理的表视图中删除对象时出错

ASP.NET里删除List集合里一个对象