Присвоение viewbag переменной в функции JQuery - PullRequest
1 голос
/ 15 апреля 2020

Я использую MVC и пытаюсь проверить, достаточно ли товара в запасе. Я делаю это в моем контроллере с помощью

        [HttpPost]
        [ValidateAntiForgeryToken]
        [Audit]
        public void AddUnits(int so_id, int site_id, int[] addItem_id, int[] addItem_qty)
        {
            // Loop however many times is necessary to iterate through the largest array
            for (int i = 0; i < Math.Max(Math.Max(addItem_id.Length, addComp_id.Length), addPart_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];
                    }


                    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)
                    {
                        ViewBag.itemOnHand = SO_Item.On_Hand;

                        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;
                    }

                    }
                }
            }

            db.SaveChanges();
        }

. В настоящее время я пытаюсь передать инвентаризацию этого предмета в сумку, выполнив ViewBag.itemOnHand = SO_Item.On_Hand;

Затем моя функция просмотра Jquery выглядит так:

 // Get all item ids and quantities and store them in arrays
        var itemssel = document.getElementsByClassName("Item-select");
        var itemsqtysel = document.getElementsByClassName("Item-qty");
        var itemsdiscsel = document.getElementsByClassName("Item-disc");
        var itemOnHand = @ViewBag.itemOnHand;
        for (i = 0; i < itemssel.length; i++) {
            items[i] = itemssel[i].options[itemssel[i].selectedIndex].value;
            itemsqty[i] = itemsqtysel[i].value;
            itemsdisc[i] = itemsdiscsel[i].value;
            if (itemsqty[i] < 0) {
                alert("Quantities can't be negative!");
                return;
            }      
            if (itemsqty[i] < itemOnHand) {
                alert("Not enough inventory in site!");
                return;
            }

// The add units method is then called here

 // Send all the values to the AJAX function and respond with success or error 
        $.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);
            }
        });

Но это работает не так, как сейчас. Почему это так?

В соответствии с запросом, вот мой метод GET для страницы, перед тем как она публикует

        // GET: SODetails/Create
        [RestrictAccess(restriction = AccessRestrictions.ModifySalesOrder)]
        public ActionResult Create(int orderId)
        {
            var SOID = (from i in db.SalesOrders.Where(x => x.ID == orderId).Where(x => x.deleted == false)
                        select new
                        {
                            SO_id = i.ID,
                            status = i.ID + " (Status: " + i.SalesOrderStatus +")",
                        }).OrderByDescending(x => x.SO_id).ToList();

            var item = (from i in db.Items.Where(x => x.deleted == false)
                        select new
                        {
                            itemID = i.ID,
                            itemName = i.Product_Number + " : " + i.ItemID + " : " + i.Name
                        }).OrderBy(x => x.itemName).ToList();

            var component = (from c in db.Components.Where(x => x.deleted == false)

                             select new
                             {
                                 compID = c.ID,
                                 compName = c.Product_Number + " : " + c.ComponentID + " : " + c.Name
                             }).OrderBy(x => x.compName).ToList();

            var part = (from c in db.Parts.Where(x => x.deleted == false)

                        select new
                        {
                            partID = c.ID,
                            partName = c.Product_Number + " : " + c.PartID + " : " + c.Name
                        }).OrderBy(x => x.partName).ToList();
            var sites = (from s in db.Sites
                         select new
                         {
                             siteID = s.ID,
                             siteName = s.Name
                         }).OrderBy(x => x.siteName).ToList();

            sites.Insert(0, new { siteID = 0, siteName = "Main Inventory" });

            var masters = db.Items.Where(x => x.Product_Number.Contains("106101") || x.ItemID.Contains("106101"));
            List<int> ids = new List<int>();
            foreach(Item i in masters.Where(x => x.Product_Number.Contains("BMU") || x.Product_Number.Contains("BMDU") || x.Product_Number.Contains("BMS")))
            {
                ids.Add(i.ID);
            }
            ViewBag.BMUMasters = ids.ToArray();
            ids = new List<int>();
            foreach (Item i in masters.Where(x => x.Product_Number.Contains("GMU")))
            {
                ids.Add(i.ID);
            }
            ViewBag.GMUMasters = ids.ToArray();
            ViewBag.ItemID = new SelectList(item, "itemID", "itemName");
            ViewBag.ComponentID = new SelectList(component, "compID", "compName");
            ViewBag.PartID = new SelectList(part, "partID", "partName");
            ViewBag.SalesOrderID = new SelectList(SOID, "SO_id", "status");
            ViewBag.SiteID = new SelectList(sites, "siteID", "siteName");
            ViewBag.invSiteID = new SelectList(sites, "siteID", "siteName");
            return View();
        }

1 Ответ

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

Попытайтесь добавить объединение нулей, это вернет 0, если ViewBag.itemOnHand пусто;

var itemOnHand = @(ViewBag.itemOnHand ?? 0);

Затем, если вы собираетесь использовать его для некоторых числовых операций, попытайтесь заставить его стать integer;

var itemOnHand = Number(@(ViewBag.itemOnHand ?? 0));

Поскольку у вас уже есть оператор if или проверки на ноль до назначения ViewBag, вы можете просто вернуть представление и добавить ViewBag.Error;

if (SO_Item != null)
{
   // .. if not null
}else{
   // if null return view
   ViewBag.Error = "your error here";
   return View();
}

Затем куда-нибудь по вашему мнению добавьте это;

@if(ViewBag.Error != null){
   <div class="row error">
      <div class="col-md-12">
         Error occured: <strong>@ViewBag.Error</strong>
      </div>
   </div>
}
...