【问题标题】:Need Help calling function inside of a Jquery timing function需要帮助在 Jquery 计时函数中调用函数
【发布时间】:2015-12-03 06:53:22
【问题描述】:

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

第 138-138 行 是我的自动代码,当它将文本放入 html 中的无序列表时效果很好,但是当我使用 Razor 调用 viewbag 时,我无法得到任何输出. 第 141-16 行2 是我设置计时器查询函数然后调用我的 c# 函数的所有不同尝试,我得到了一个警报框来处理计时器。

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

$(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>

【问题讨论】:

  • 公共 Actionresult 是我的家庭控制器上代码的开始,底部的 div 是我在 html 中调用它的地方。任何帮助以及最简单和最平凡的解决方案都将不胜感激,它在决赛周的 1:30 和我的批判性思维能力现在就要投篮了,所以现在很难理解任何事情了
  • 请正确格式化您的代码。

标签: javascript c# jquery model-view-controller


【解决方案1】:

我认为您正在混淆一堆 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);

您可能还想传递要在该函数中检查的任何参数。参数可以作为查询字符串传递。更多信息在这里 Use querystring variables in MVC controller

【讨论】:

  • 谢谢你,它有点帮助,但我不太熟悉 ajax 或 Json,我不确定从这里去哪里——如果有帮助,我会发布更多我的代码跨度>
  • 见上面的答案。将函数的返回类型更改为 JsonResult (虽然它也适用于 ActionResult 但这样更清楚)。构建列表后,只需将它们放入 JSON 字符串中,如下所示: return Json(new {Messages = messages});
【解决方案2】:

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

或者,您可以查看 angular、knout 或 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);
}
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2015-02-17
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2021-11-04
    相关资源
    最近更新 更多