Изменение метода void на метод ActionResult, когда есть функция Ajax, вызывающая метод - PullRequest
1 голос
/ 16 апреля 2020

Я недавно преобразовал свой метод из void в ActionResult, чтобы я мог возвращать сообщения об ошибках, если условие не выполняется

вот метод

        [HttpPost]
        [ValidateAntiForgeryToken]
        [Audit]
        public ActionResult AddUnits(int so_id, int site_id, int[] addItem_id, int[] addItem_qty, int[] addItem_disc)
        {
            bool canCreate = true;
            string errors = "";

            // Loop however many times is necessary to iterate through the largest array
            for (int i = 0; i < Math.Max(Math.Max(addItem_id.Length); i++)
            {
                foreach (SODetails sod in db.SalesOrders.Find(so_id).SalesDetails)
                {
                    if (i < addItem_id.Length && addItem_qty[i] != 0 && sod.ItemID == addItem_id[i] && addItem_id[i] != 365 && addItem_id[i] != 410) 
                    {
                        sod.item_qty += addItem_qty[i];
                        sod.item_discount = addItem_disc[i];
                        addItem_id[i] = 0;
                        addItem_qty[i] = 0;
                        addItem_disc[i] = 0;
                    }
                }
                db.SaveChanges();

                if(i < addItem_qty.Length && addItem_qty[i] != 0)
                {
                    SODetails sODetails = new SODetails
                    {
                        SalesOrderID = so_id,
                        SiteID = site_id
                    };

                    // Only add a unit to the SODetails object if it's not null and has an id and quanitity specified
                    if(i < addItem_id.Length && addItem_id[i] != 0 && addItem_qty[i] != 0)
                    {
                        sODetails.ItemID = addItem_id[i];
                        sODetails.item_qty = addItem_qty[i];
                        sODetails.item_discount = addItem_disc[i];
                    }

                    if (sODetails.SiteID == 0)
                        sODetails.SiteID = null;

                    // Here on is basically the same as the old post function below
                    SalesOrder SO = db.SalesOrders.Find(sODetails.SalesOrderID);
                    SODetails salesOrderDetails = db.SODetails.Add(sODetails);
                    salesOrderDetails.SalesOrder = SO;

                    Item SO_Item = db.Items.Find(sODetails.ItemID);

                    if (SO_Item != null)
                    {

                        if (SO.OrderType == SOType.OffSiteInventory && salesOrderDetails.siteAvailable(SO_Item) < salesOrderDetails.item_qty)
                        {
                            errors += "Not enough" + SO_Item.Name + "in inventory location";
                            canCreate = false;                           
                        }
                        else { 

                        sODetails.item_qty = sODetails.item_qty == null ? 0 : sODetails.item_qty;
                        int qtyOrdered = sODetails.item_qty == null ? 0 : (int)sODetails.item_qty;
                        salesOrderDetails.dynamicItem_qty = qtyOrdered;

                        if (SO_Item.SalesOrderMessage != null)
                            TempData["SalesOrderMessage"] = SO_Item.SalesOrderMessage;

                        }
                    }

                    if (!canCreate)
                    {
                        ModelState.AddModelError(string.Empty, errors);
                        //return View(so_id);
                        return RedirectToAction("Details", "SODetails", new { orderId = so_id });
                    }

                    db.SODetails.Add(sODetails);                   
                }
            }

            db.SaveChanges();

            return RedirectToAction("Details", "SODetails", new { orderId = so_id });
        }

Метод вызывается через мою Ajax функцию, которая выглядит следующим образом

  $.ajax({
            type: "POST",
            url: "@IGT.baseUrl/SODetailsAjax/AddUnits",
            traditional: true,
            data: {
                __RequestVerificationToken: token, 
                so_id: @Int32.Parse(Request["orderId"]),
                site_id: site,
                addItem_id: items,
                addItem_qty: itemsqty,
                addItem_disc: itemsdisc,
                addComp_id: comps,
                addComp_qty: compsqty,
                addComp_disc: compsdisc,
                addPart_id: parts,
                addPart_qty: partsqty,
                addPart_disc: partsdisc
            },
            success: function () {
                location.href = "../SalesOrders/Details?id=@so.ID";
            },
            error: function (jqXHR, status, error) {
                alert("Error: " + error);
            }
        });

Каждый раз, когда метод запускается сейчас, он возвращает ошибку вместо успеха. Как я могу изменить свой код, чтобы он все еще возвращал успех, если условия были действительны?

1 Ответ

1 голос
/ 16 апреля 2020

Если код только для ajax, тогда я рекомендую использовать вместо него веб-API. Тогда вы либо вернете Ok, либо BadRequest. Если это может быть для обоих, и вы хотите остаться с MVC, то вы можете сделать это, чтобы вернуть неудавшийся запрос

  if (Request.IsAjaxRequest())
   {
       var result=new { Success="False", Message="Error Message"};
       return Json(result, JsonRequestBehavior.AllowGet);
   }
    else
   {
     //normal mvc error redirect goes here
   }

и это для успешного запроса

  if (Request.IsAjaxRequest())
   {
       var result=new { Success="True"};
       return Json(result, JsonRequestBehavior.AllowGet);
   }
    else
   {
     //normal mvc success redirect goes here
   }

Код успеха, скорее всего, будет go в конце ActionResult после db.Savechanges() в вашем коде. В вашем случае нормальный mvc успех перенаправления будет

return RedirectToAction("Details", "SODetails", new { orderId = so_id });

Пример неудачного запроса будет выглядеть так:

  if (!canCreate)
  {
     if (Request.IsAjaxRequest())
     {           
         var result=new { Success="False", Message=errors };
         return Json(result, JsonRequestBehavior.AllowGet);
     }
    else
    {
       ModelState.AddModelError(string.Empty, errors);
       return RedirectToAction("Details", "SODetails", new { 
       orderId = so_id });
   }
}

Вам также необходимо обновить jQuery что-то вроде этого

success: function (data) {
 if(data.Success){
            location.href = "../SalesOrders/Details?id=@so.ID";
        }else{
        var errorMessage = data.Message;
        //display errorMessage on the client
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...