I am trying to have a button that allows the users to update the Quantity of the items they ordered. When the users tries to update the Quantity that is more than what is available I need to do nothing and show an error message saying something like Entered Quantity is more than what is available and shouldn't update anything in the DB
The View
<form asp-action="EditItem">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
..............
<!--<input type="text" style="border:none;font-size: smaller" id="@("errorMessage")"" readonly /> -->
<div class="form-group">
<label asp-for="OrderQuantity" class="control-label"></label>
<input asp-for="OrderQuantity" id="txt" class="form-control" />
<span asp-validation-for="OrderQuantity" class="text-danger"></span>
</div>
<input type="hidden" id="orderId" name="orderId" value="@Model.OrderId" />
<input type="hidden" id="inventoryorderId" name="inventoryorderId" value="@Model.InventoryOrderId" />
<input type="hidden" id="inventoryId" name="inventoryId" value="@Model.InventoryId" />
<button id="button">Update</button>
</form>
</div>
</div>
@section Scripts {
<script type="text/javascript">
$("#button").click(function () {
var orderedQuantity = $("#txt").val();
var orderId = $("#orderId").val();
var inventoryorderId = $("#inventoryorderId").val();
var inventoryId = $("#inventoryId").val();
var data = {
orderId: orderId,
inventoryorderId: inventoryorderId,
inventoryId: inventoryId,
orderedQuantity: orderedQuantity
};
$.ajax({
type: 'POST',
url: '@Url.Action("EditItem", "Orders")',
data: data,
dataType: "json",
success: function (result) {
if (result !== "") {
if (result.available == "NotAvailable")
$("#errorMessage").val("Enter a valid Quantity");
}
else if (result == "") {
var url = '@Url.Action("Index", "Orders")';
window.location.href = url "[email protected]";
}
},
error: function (error) {
alert(error);
}
});
});
</script>
}
Controller Action
public async Task<JsonResult> EditItem(int? orderId, int? inventoryorderId, int? inventoryId, int? orderedQuantity)
{
var inventoryOrder = await _context.InventoryOrders
.FirstOrDefaultAsync(io => io.InventoryOrderId == inventoryorderId);
int curentOrdQuantity = inventoryOrder.OrderQuantity;
inventoryOrder.OrderQuantity = (int)orderedQuantity;
_context.SaveChanges();
var intData = await _context.Inventories.FindAsync(inventoryId);
int availQty = intData.QuantityAvailable;
if ((int)orderedQuantity > curentOrdQuantity)
{
if (availQty < ((int)orderedQuantity - curentOrdQuantity))
{
return Json(new { status = "NotAvailable", available = intData.QuantityAvailable });
}
else
{
//Updating the Order
inventoryOrder.OrderQuantity = (int)orderedQuantity;
_context.Update(inventoryOrder);
await _context.SaveChangesAsync();
//Updating Inventory
intData.QuantityAvailable = intData.QuantityAvailable - ((int)orderedQuantity - curentOrdQuantity);
_context.Update(intData);
await _context.SaveChangesAsync();
}
}
else if ((int)orderedQuantity < curentOrdQuantity)
{
//Updating the Order
inventoryOrder.OrderQuantity = (int)orderedQuantity;
_context.Update(inventoryOrder);
await _context.SaveChangesAsync();
//Updating Inventory
intData.QuantityAvailable = intData.QuantityAvailable (curentOrdQuantity - (int)orderedQuantity);
_context.Update(intData);
await _context.SaveChangesAsync();
}
return Json("");
}
There are two issue
When the Quantity entered is more I am trying
return Json(new { status = "NotAvailable", available = intData.QuantityAvailable });but still the OrderQuantity in the database got updated to the new value that was entered. Even though I am not updating the Order in the code it got updated to newly entered value. How can I restore it to old value and not change what was enteredwhen the Quantity is lesser than the QuantityAvailable I am updating both the inventory and the order and returning
return Json("");I was hoping to navigate back to the Index pageelse if (result == "") { var url = '@Url.Action("Index", "Orders")'; window.location.href = url "[email protected]"; }
but nothing happens it just stays in the smae page. Can anyone please help what I am missing here
EDIT The first issue is reolved but still I am not able to get the success() work on the ajax I tried to add alert in the success but my alert is not showing up
success: function (result) {
alert(result);
if (result !== "") {
if (result.available == "NotAvailable")
$("#errorMessage").val("Enter a valid Quantity");
}
else if (result == "") {
CodePudding user response:
First Issue
You always update the DB, the first rows of your method get the InventoryOrderand update the row, I commented out the code
public async Task<JsonResult> EditItem(int? orderId, int? inventoryorderId, int? inventoryId, int? orderedQuantity)
{
var inventoryOrder = await _context.InventoryOrders
.FirstOrDefaultAsync(io => io.InventoryOrderId == inventoryorderId); // Get the InventoryOrder
int curentOrdQuantity = inventoryOrder.OrderQuantity; // Save the currentOrdQUantity
inventoryOrder.OrderQuantity = (int)orderedQuantity; // UPDATE the OrderQuantity
_context.SaveChanges(); // <- Persist to DB
Second Issue
I suggest you to add a console.log(result); after the success: function (result) {
Consideration
With the
Nullableyou can use the.Valuefor accessing the value i.e.orderId.Valueinstead of(int)orderId.Since you pass nullable values consider checking if are null before casting or reading the value
