Наконец-то нашел ответ с этим. Поэтому я просто пересмотрел все, так что валидация модели с контроллера все равно будет там.
Вот мой код:
Для разметки таблицы
<tr>
<td>
@Html.DisplayFor(modelItem => item.RegionName)
</td>
<td>
@Html.DisplayFor(modelItem => item.RegionCode)
</td>
<td>
@Html.DisplayFor(modelItem => item.RegionKey)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td class="text-center">
<a asp-action="Edit" asp-route-id="@item.RegionId"><i class="fa fa-edit text-info"></i></a>
<a href="#" onclick="showDeleteConfirmation('@string.Format(Constants.Message.DeletePrompt, item.RegionName)', event, @item.RegionId)"><i class="fa fa-trash text-danger"></i></a>
</td>
</tr>
где вызывается функция JavaScript ниже:
@section Scripts{
<script type="text/javascript">
function showDeleteConfirmation(message, event, id) {
event.preventDefault();
showConfirmationModal(message).then(function () {
$("#id").val(id);
$("#formDelete").submit();
});
}
</script>
}
, где showConfirmationModal()
- это функция обещания, которая использует bootbox.js (библиотека, которая оборачивает загрузочный модальный для более легкого использования).
site.js
function showConfirmationModal(message, title = "Confirm", size = "medium", confirmText = "Yes", canceltext = "No") {
const deffered = $.Deferred();
bootbox.confirm({
title: title,
message: message,
size: size,
buttons: {
confirm: {
label: confirmText,
className: "btn-success"
},
cancel: {
label: canceltext,
className: "btn-danger"
}
},
callback: function (result) {
if (result) {
deffered.resolve(result);
} else {
deffered.reject(result);
}
}
});
return deffered.promise();
}
При обратном вызове он отправит скрытую форму ниже. Конечно, не забудьте установить идентификатор для удаления.
Скрытая форма для удаления действия
<form method="post" asp-action="Delete" id="formDelete" class="hidden">
<input type="hidden" id="id" name="id" />
<input type="hidden" asp-for="Item1.RegionName" name="RegionName" />
<input type="hidden" asp-for="Item1.Page" name="Page" />
<input type="hidden" asp-for="Item1.SortBy" name="SortBy" />
<input type="hidden" asp-for="Item1.SortOrder" name="SortOrder" />
</form>
Чтобы показать информационное сообщение (для успешного удаления), я создал PartialView для показа мод, если есть набор данных во временных данных или временных данных. Это было добавлено на странице _Layout.cshtml
:
_ModalScriptsInit.cshtml
@using Data.Utilities
@{
var text = TempData[Constants.Common.ModalMessage];
if (text != null && !text.Equals(string.Empty))
{
<script type="text/javascript">
showDefaultModal("@text");
</script>
}
}
Так что в моем контроллере после успешного удаления я просто установлю TempData с его ключом, как показано ниже:
Контроллер
[HttpPost]
public async Task<IActionResult> Delete(int id, RegionSearchViewModel searchViewModel)
{
try
{
var validationResult = await new RegionHandler(_regionService).CanDelete(id);
if (validationResult == null)
{
await _regionService.DeleteById(id);
TempData[Constants.Common.ModalMessage] = Constants.Message.RecordSuccessDelete;
return RedirectToAction(nameof(List), searchViewModel);
}
ModelState.AddModelError(validationResult);
}
catch (Exception ex)
{
var exceptionMessage = await Helpers.GetErrors(ex, _emailService);
ModelState.AddModelError(new ValidationResult(exceptionMessage));
}
ModelState.AddModelError(string.Empty, "Invalid delete attempt.");
return RedirectToAction(nameof(List), searchViewModel);
}
Я пока не уверен, что пока это лучший способ. Пожалуйста, дайте предложение о том, как улучшить этот код. Спасибо!