Действие ниже управляет котировками ордеров. И у меня есть оператор if внутри. Если количество продукта в заказе превышает количество товара на складе, я хочу показать сообщение об ошибке с помощью TempData и Bootstrap Modal. Но когда я пытаюсь проверить, работает ли это, хотя TempData не имеет значения null, модальное окно не отображается. И я использую одну и ту же технику для разных областей одного и того же проекта. Но это единственный, который не работает. Сопутствующее действие:
public async Task<IActionResult> ManageOrderQuote(int orderId, string status, string statusDescription)
{
var order = await orderQuote.GetByIdAsync(orderId);
var orderDetails = await orderQuoteDetail.GetAllByIdAsync(orderId);
foreach (var detail in orderDetails)
{
var productId = detail.ProductId;
var productToUpdate = await product.GetByIdAsync(productId);
productToUpdate.UnitsOnOrder += detail.Quantity;
productToUpdate.UnitsInStock -= detail.Quantity;
if (productToUpdate.UnitsInStock < 0)
{
TempData["ErrorMessage"] = "The " + productToUpdate.ProductName + " product doesn't have enough stock.";
return RedirectToAction("PendingOrders");
}
await product.UpdateAsync(productToUpdate);
}
order.Status = status;
order.StatusDescription = statusDescription;
await orderQuote.UpdateAsync(order);
return RedirectToAction("PendingOrders");
}
JS-код и модальное окно:
@if (TempData["ErrorMessage"] != null)
{
<script>
$(document).ready(function () {
$('#errorModal').modal('show');
});
</script>
}
<!-- Error Modal -->
<div class = "modal fade" id = "errorModal" tabindex = "-1" aria-labelledby = "errorModalLabel" aria-hidden = "true">
<div class = "modal-dialog modal-dialog-centered">
<div class = "modal-content">
<div class = "modal-header bg-danger text-light">
<h5 class = "modal-title" id = "errorModalLabel">Error</h5>
</div>
<div class = "modal-body">
<p class = "text-danger">@TempData["ErrorMessage"]</p>
</div>
<div class = "modal-footer">
<button type = "button" class = "btn btn-danger" data-bs-dismiss = "modal">Close</button>
</div>
</div>
</div>
</div>
Это вызов AJAX:
$('#statusForm').submit(function (e) {
e.preventDefault();
var orderId = $('#orderId').val();
var status = $('#status').val();
var statusDescription = $('#statusDescription').val();
$.ajax({
url: '/Sales/ManageOrderQuote',
type: 'POST',
data: {
orderId: orderId,
status: status,
statusDescription: statusDescription
},
success: function (response) {
$('#statusModal').modal('hide');
$('.modal-backdrop').remove();
window.location.reload();
},
error: function () {
alert('An error occurred while changing order status.');
}
});
});
PendingOrders.cs:
public async Task<IActionResult> PendingOrders()
{
var orders = await orderQuote.GetAllPendingOrders();
var orderList = new List<OrderVM>();
foreach (var order in orders)
{
var orderVM = new OrderVM()
{
OrderQuoteId = order.OrderQuoteId,
CustomerName = order.Customer?.ContactFirstName + " " + order.Customer?.ContactLastName,
OrderDate = order.OrderDate,
Status = order.Status,
StatusDescription = order.StatusDescription
};
orderList.Add(orderVM);
}
return View(orderList);
}
@QingGuo Что вы подразумеваете под «кодом ManageOrderQuote»? У меня нет на это представления. Это просто пост-действие, как я задал в своем вопросе.
Какое представление вы публикуете для этого действия? Как вы публикуете действие ManageOrderQuote?
@QingGuo Представление, которое я публикую для этого действия, — PendingOrders. Я не публиковал это полностью, чтобы не усложнять ситуацию. И я добавил запрос AJAX в свой пост.
Находится ли ваш JS-код и мода в представлении PendingOrders? Не могли бы вы поделиться своим кодом действия PendingOrders?
Да, мой JS-код и модальное окно находятся в представлении PendingOrders. Я добавил действие PendingOrders.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Мы можем попытаться
1. Добавьте <div id = "divToUpdated"></div> на страницу с вызовом AJAX для модального отображения.
2. Затем измените успех ajax, например:
success: function (response) {
$('#statusModal').modal('hide');
$('.modal-backdrop').remove();
// window.location.reload();
$("#divToUpdated").html(response);
},
Примечание. Отобразится модальная страница PendingOrders.
Или с помощью 1,2 мы можем использовать PartialView для отображения модального окна, поместить JS-код и модальное окно в PartialView с именем _modalPartialView, затем мы вызываем PartialView следующим образом:
if (productToUpdate.UnitsInStock < 0)
{
TempData["ErrorMessage"] = "The " + productToUpdate.ProductName + " product doesn't have enough stock.";
return PartialView("_modalPartialView");
}
результат:
Итак, я попробовал это решение, оно показалось справедливым, но тоже не сработало. Потом я попробовал все это переписать. Это тоже не сработало, но я попробую это исправить. Дам вам знать, если я это сделал. Спасибо за все.
Я вернул JsonResult в действии, а затем показал модальные окна внутри вызова AJAX. Это сработало.
«Но этот единственный не работает». Какой у вас код ManageOrderQuote? Я тестирую это так: i.sstatic.net/bEKDd.png