Хорошо, чтобы обобщить мои выводы.
- Создайте на странице метод-обработчик, например,
OnPostMyAction
. Введите необходимые аргументы.
// itemId can also be Guid
public async Task<IActionResult> OnPostMyAction(long itemId, bool isEnabled)
{
await mRepository.EnableItem(itemId, isEnabled);
return new OkResult();
}
Создайте функцию JS в разделе
Scripts
страницы.
function requestMyAction(itemId, isChecked, loaderId) {
document.getElementById(loaderId).style.display = "inline-block";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
document.getElementById(loaderId).style.display = "none";
if (this.status === 200) {
// Ok
}
}
};
var url = '@Url.Page("/PageName", "MyAction")';
xhr.open('POST', url);
xhr.setRequestHeader('RequestVerificationToken', '@Xsrf.GetAndStoreTokens(Model.HttpContext).RequestToken');
var data = new FormData();
data.append('itemId', itemId);
data.append('isEnabled', isChecked);
xhr.send(data);
}
Я знаю, что существует fetch
API, возможно, кто-нибудь сможет написать здесь новую реализацию :-) У меня нет опыта работы с JS, поэтому я взял то, что нашел, в более или менее реализованном состоянии.
Вставить механизм защиты от подделки в начало страницы.
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
Добавить
loader
класс в CSS:
.loader {
border: 6px solid #f3f3f3; /* Light grey */
border-top: 6px solid #3498db; /* Blue */
border-radius: 50%;
width: 30px;
height: 30px;
animation: loaderSpin 2s linear infinite;
}
@keyframes loaderSpin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
Добавьте обработчик кликов и элемент
loader
(возможно, рядом с флажком).
<input asp-for="@item.IsEnabled"
onclick="requestMyAction('@item.Id', this.checked, 'loader-@item.Id');" />
<div class="loader" style="display: none;" id="loader-@item.Id"></div>