#javascript #jquery #ajax #asp.net-core #asp.net-ajax
Вопрос:
Я создаю свое первое приложение .NET Core MVC и использую Entity Framework. Кнопка вызывает страницу AddtoOrder, которая получает набор параметров с предыдущей страницы, на странице AddtoOrder пользователям разрешается вводить количество, которое они хотели бы заказать. Классы моделей, как показано ниже
public class Item { public int CustomId { get; set; } public Inventory Inventory { get; set; } }
Где Инвентарь-это другой класс
public partial class Inventory { public string Name { get; set; } public int QuantityAvailable { get; set; } public string RoomNumber { get; set; } public int InventoryId { get; set; } [NotMapped] public int? QuantityReq { get; set; } }
Представление AddtoOrder-это QuantityReq
единственное поле, в которое пользователи будут вводить другие данные, полученные из БД.
@model JAXSurplusMouseApp.Models.Item @{ ViewData["Title"] = "Edit"; } lt;h4gt;Add to Orderlt;/h4gt; lt;hr /gt; lt;div class="row"gt; lt;div class="col-md-4"gt; lt;form asp-action="AddtoOrder"gt; lt;div asp-validation-summary="ModelOnly" class="text-danger"gt;lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="@Model.Inventory.Name" class="control-label"gt;lt;/labelgt; lt;input asp-for="@Model.Inventory.Name" class="form-control" readonly /gt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="@Model.Inventory.QuantityAvailable" class="control-label"gt;lt;/labelgt; lt;input asp-for="@Model.Inventory.QuantityAvailable" class="form-control" readonly /gt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="@Model.Inventory.RoomNumber" class="control-label"gt;lt;/labelgt; lt;input asp-for="@Model.Inventory.RoomNumber" class="form-control" readonly /gt; lt;/divgt; lt;/formgt; lt;form method="post" asp-controller="Inventories" asp-action="OrderItem"gt; lt;label class="control-label"gt;Quantity Requiredlt;/labelgt; lt;input type="text" id="quantityReq" name="quantityReq" value=@Model.Inventory.QuantityReq /gt; @Html.ValidationSummary(false, "", new { @class = "error" }) lt;input type="hidden" id="customerID" name="customerID" value="@Model.CustomId" /gt; lt;input type="hidden" id="invetoryID" name="invetoryID" value="@Model.Inventory.InventoryId" /gt; lt;button type="submit"gt;lt;ugt;Orderlt;/ugt;lt;/buttongt; lt;/formgt; lt;/divgt; lt;/divgt; @section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }
Поэтому мне нужно проверить введенное пользователем значение по значению в БД, поэтому в контроллере я сравниваю значения, как показано ниже, где, если введенное пользователем количество больше, чем количество, доступное в БД else if (quantityReq gt; intData.QuantityAvailable)
в OrderItem
// Action to launch the AddtoOrder page public async Tasklt;IActionResultgt; AddtoOrder(int? inventoryID, int? custID) { if (inventoryID == null || custID == null) { return NotFound(); } Customer custData = await _context.Customers.FindAsync(custID); var inventories = await _context.Inventories.FindAsync(inventoryID); var model = new Item { CustomId = (int)custID, Inventory = inventories }; return View(model); } //Action athat allows the users to submit the order public async Tasklt;IActionResultgt; OrderItem(int? customerID, int? invetoryID, int quantityReq) { if (customerID == null || invetoryID == null) { return NotFound(); } Customer custData = await _context.Customers.FindAsync(customerID); var intData = await _context.Inventories.FindAsync(invetoryID); if (quantityReq lt;= intData.QuantityAvailable amp;amp; quantityReq gt; 0) { InventoryOrder io = new InventoryOrder(); io.OrderQuantity = quantityReq; io.InventoryId = (int)invetoryID; _context.Add(io); await _context.SaveChangesAsync(); intData.QuantityAvailable = intData.QuantityAvailable - quantityReq; _context.Update(intData); await _context.SaveChangesAsync(); return RedirectToAction("Index", "Inventories", new { id = customerID }); } else if (quantityReq gt; intData.QuantityAvailable){ ModelState.AddModelError("QuantityReq", "Quantity entered more than Quantity Available"); return RedirectToAction("AddtoOrder", "Inventories", new { inventoryID = invetoryID, custID = customerID }); } }
Поскольку я возвращаюсь к виду, отличному от действия, ошибка проверки не отображается на AddtoOrder
странице OrderItem
действия. Как я могу справиться с ошибкой проверки!
Ответ №1:
Вы можете использовать данные TempData для хранения флага сбоя проверки, как показано ниже:
[HttpGet] public IActionResult AddtoOrder(int? inventoryID, int? custID) { if (inventoryID == null || custID == null) { return NotFound(); } Customer custData = await _context.Customers.FindAsync(custID); var inventories = await _context.Inventories.FindAsync(inventoryID); var model = new Item { CustomId = (int)custID, Inventory = inventories }; //add the following code to judge if validation fail or not... if(TempData["Error"]!=null) { ModelState.AddModelError("Inventory.QuantityReq", "Quantity entered more than Quantity Available"); } return View(model); } [HttpPost] public async Tasklt;IActionResultgt; OrderItem(int? customerID, int? invetoryID, int quantityReq) { //... else if (quantityReq gt; intData.QuantityAvailable) { TempData["Error"] = "Validation fail"; //add this... return RedirectToAction("AddtoOrder", "Inventories", new { inventoryID = invetoryID, custID = customerID }); } return View(); }