У меня есть страница для редактирования ресурса, содержащая коллекцию другого ресурса. Данные коллекции отображаются в виде таблицы. Вот только сокращенная версия:
<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();
показывает ожидаемое поведение. Так что где-то между оставлением моего серверного кода и получением ответа в браузере должно быть некоторое кеширование, которое вызывает проблему. Но я не могу найти никакой информации, где бы я мог это отключить.
Есть идеи, что может помочь здесь?