ASP.NET Core Browser отображает неверные данные после редактирования коллекции через POST - PullRequest
0 голосов
/ 28 октября 2019

У меня есть страница для редактирования ресурса, содержащая коллекцию другого ресурса. Данные коллекции отображаются в виде таблицы. Вот только сокращенная версия:

<form method="post">
    <input type="hidden" asp-for="ProcessDataGroupResource.Id" />
    <div class="form-group">
        <label asp-for="ProcessDataGroupResource.Name" class="h5 control-label"></label>
        <input asp-for="ProcessDataGroupResource.Name" class="form-control" />
    </div>
    <div class="form-group">
        <label class="h5 control-label">Data Points</label>
        <button type="submit" asp-page-handler="AddNewRow" class="btn btn-secondary form-control">Add New Data Point</button>
        <table id="data-point-table" class="table">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>@*Actions*@</th>
                </tr>
            </thead>
            <tbody>
                @for (int i = 0; i < Model.ProcessDataGroupResource.DataPoints.Count; i++)
                {
                    <tr class="data-point-row">
                        <td>
                            <input type="hidden" asp-for="ProcessDataGroupResource.DataPoints[i].Id" />
                            <input type="text" autocomplete="off" asp-for="ProcessDataGroupResource.DataPoints[i].Name" />
                        </td>
                        <td>
                            <button type="submit" asp-page-handler="RemoveDataPoint" asp-route-id="@(i)" class="btn btn-link delete-row-button">Delete</button>
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
    <div class="form-group">
        <input type="submit" asp-page-handler="SaveGroup" value="Save" class="btn btn-primary" />
    </div>
</form>

Я хочу иметь возможность добавлять и удалять отдельные строки из таблицы, но не хочу сохранять изменения немедленно в базе данных. Поскольку ModelBinding в ядре asp.net использует индексы коллекций и не может работать с пробелами, я решил отправить запрос на публикацию с использованием специального обработчика страниц и выполнить модификацию коллекции на сервере вместо того, чтобы загромождать свой java-скрипт на стороне клиента неловкимкод для изменения идентификаторов элементов формы. (Вначале я хотел использовать Ajax, но не мог найти способ определить разные обработчики в одной форме.)

Так что на сервере я просто делаю

public async Task<IActionResult> OnPostRemoveDataPointAsync(int pointIndex)
{
    await PopulateSelectLists();
    ProcessDataGroupResource.DataPoints.RemoveAt(pointIndex);
    return Page();
}

и перерисовываюснова полная страницаЭто хорошо работает для отдельных элементов ввода, но не работает в браузере для коллекции DataPoints, когда нажата кнопка удаления для определенной строки. Например: я пытался удалить вторую из четырех строк. Когда я отлаживаю рендеринг Razor-кода, все работает как положено. Тем не менее, ответ на клиенте по-прежнему отображает строки с 1 по 3, но удалил строку с номером 4. Я развернул его до HTTP-ответа и увидел, что это поле содержит ложные старые данные с меньшим количеством строк. Отладка на сервере до вызова return Page(); показывает ожидаемое поведение. Так что где-то между оставлением моего серверного кода и получением ответа в браузере должно быть некоторое кеширование, которое вызывает проблему. Но я не могу найти никакой информации, где бы я мог это отключить.

Есть идеи, что может помочь здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...