Показать ошибку проверки в представлении, отличном от действия, не работает

#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(); }