调用Jquery计时函数内部的函数需要帮助

Need Help calling function inside of a Jquery timing function

本文关键字:函数 帮助 内部 调用 Jquery      更新时间:2023-09-26

我正在开发一个MVC应用程序网站,遇到了一个障碍,我在HomeController上写了一个名为"AlertCheckFunction"的函数,它应该检查某些条件,然后将消息添加到字符串列表中,然后将此列表添加到ViewBag.Message中,并在HTML视图中输出。我正在尝试编写一个Jquery函数,该函数设置在计时器上,这样这些警报将每隔一定的秒重新检查一次条件,并将这些条件重新输出到Jquery中的自动报价器中。

第138-138行是我的自动报价器,当它将文本放在html中的无序列表中时,它工作得很好,但当我用Razor调用viewbag时,我无法获得任何输出第141-16行2是我设置计时器查询函数然后调用c#函数的所有不同尝试,我得到了一个关于计时器的警告框。

但我不知道如何正确调用函数。问题的链接

$(document).ready(function () {
        $('.dropdown-toggle').dropdown();
        $('.dropdown-toggle').click(function (e) {
            e.stopPropagation();
            e.preventDefault();
            });
        });        
        function tick() {
            $('#ticker li:first').slideUp(function () {          $(this).appendTo($('#ticker')).slideDown(); });
        }
        setInterval(function () { tick() }, 5000);

    //window.setInterval(AlertCheckFunction, 5000);
    //function AlertCheckFunction() { alert('test'); }
        //window.setInterval(function () {
        //    $('AlertCheckFunction');
        //}, 2000);

 //    function alert() {
 //        $('AlertCheckFunction')
 //    }
 //    setInterval(function () { alert() }, 60000)
 //window.setInterval(function() {
 //$.get('AlertCheckFunction', function(result) {
 //});
 //}, 3000);
 </script>

家庭控制器

      public ActionResult AlertCheckFunction()
    {
        List<String> Messages = new List<String>();

        foreach (var i in db.Ingredients)
        {
            if (i.Quantity < i.ReOrderPoint)
            {
                Messages.Add("The quantity of " + i.IngredientName + "Is less than the ReOrderPoint, Suggest placing another order for this ingredient!");
            }
            else
            {
                Messages.Add("No alerts from Ingredeints");
            }
        }


        foreach (var c in db.Customers)
        {
            if (DateTime.Now == c.Birthday)
            {
                Messages.Add("It is " + c.Name + "'s" + "Birthday Today!");
            }
            else
            {
                Messages.Add("No alerts from Customer!");
            }
        }


        foreach (var i in db.Inventories)
        {
            if (i.InvQuantity <= 5)
            {
                Messages.Add("The Inventory of " + i.Name + "Is less than or equal to 5, Consider making new batch");
            }
            else
            {
                Messages.Add("No alerts from Inventories");
            }
        }

        //DateTime lastMonth = DateTime.Now.AddMonths(-1);
        //DateTime twoMonthsAgo = DateTime.Now.AddMonths(-2);
        //var sales = db.Sales.Where(j => j.SaleId).ToList();
        // foreach (var x in db.Sales)
        // {
        //     var alerts = db.Sales.Where(x => x.SaleId.Count);
        ViewBag.Message = Messages;
        return RedirectToAction("Index", "Home");
    }



   HTML 

     <div>
                    <ul id="ticker">
                        @if (ViewBag.Messages != null)
                        {
                            foreach (var v in ViewBag.Message)
                            {
                                <li>
                                    @v
                                </li>
                            }
                        }
                    </ul>
     </div>

我认为您混淆了一堆Javascript和MVC代码。如果方法AlertCheckFunction位于HomeController中,则不能从Javascript调用该方法。

您可以做的是,确保该方法作为控制器操作可用,并且可以在类似/Home/AlertCheckFunction的URL上访问。

你对$.get的尝试最接近答案。检查函数及其响应(最好是JSON)是否在URL中可用,并按照以下模式进行调用。

setInterval(function () {
    $.get('/Home/AlertCheckFunction', function (resp) {
        console.log(resp); // This will be the JSON response.
    });
}, 3000);

您可能还希望传递要签入该函数的任何参数。参数可以作为查询字符串传递。更多信息请点击此处在MVC控制器中使用查询字符串变量

不要将您的项目放入控制器中的ViewBag,而是尝试返回一个JSON字符串,其中包含要放入警报框中的消息。然后,你的股票行情器可以对你的控制器进行ajax调用,并获得新的警报。

或者,如果你的结构正确,你可以研究一些像angular、knocket或ember这样的东西,当后面的数据发生变化时,它们会为你改变DOM。

在您的控制器中:

public JsonResult GetAlerts()
{
    return Json(Alerts, JsonRequestBehavior.AllowGet);
}

在你看来:

$.ajax({
   url: '@Url.Action("GetAlerts")',
   // data: {'alertType': 1}, if you wanted to send some data. The parameter name will have to be _exactly_ the same
   type: 'GET',
   success: function (response) {
       $("#alertsDiv").html(response);
}
});