.NET Core 2.1 бритвенное представление страницы не обновляется правильно при удалении объекта из коллекции в объект - PullRequest
0 голосов
/ 24 декабря 2018

Ниже мой обработчик get в pageModel

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

, и это Razor View:

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

когда я нажал кнопку удаления, отправить Удалить Вызван обработчик в модели страницы и объект в BudgetAssignYears свойство удалено Сопоставлено с отправленным index , нопосле возвращения из представленного обработчика просто удалите последний объект.Я удаляю первый объект, но после публикации удаляю последний объект.В режиме отладки все в порядке и объект в индексе удален, но в поле зрения просто удалите последний элемент.

1 Ответ

0 голосов
/ 20 мая 2019

Я заметил ту же проблему, что и вы.Добавление 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.Очистить (), чтобы очистить значения ModelState. "https://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object

...