在MVC3中更新局部视图的SetTimeout是随机执行的

SetTimeout to update a Partial View in MVC3 executes randomly

本文关键字:SetTimeout 随机 执行 视图 MVC3 更新局      更新时间:2023-09-26

我正在开发一个使用asp的应用程序。净mvc3。我创建了一个分部视图,并在视图中调用这个分部视图,这样我就可以在不重新加载页面的情况下更新div。我使用setTimeout(但我也尝试过setInterval)来定义刷新时间。问题是它不起作用,它随机刷新div,不遵循我设置的时间,并且没有我可以理解的逻辑,有时它刷新两次,有时它等待,但永远不会比我设置的时间长。这是部分视图的代码。在视图中,我只调用局部视图

<script type="text/javascript">
var st;
function updateDiv() {
    st = null;
    clearTimeout(st);
    console.log("posting");
    $.post('@Url.Action("RefreshSelfUpdatingPartial")', function (data) {
        $('#SelfUpdatingPartialDiv').hide().slideDown("slow").html(data);
        //wait 15 seconds
        st = setTimeout(updateDiv, 15000);
    });
}
updateDiv();
</script>
<div id="SelfUpdatingPartialDiv">
test
</div>

"这是部分视图的代码。在视图中,我叫它分部视图。"

如果上面所有的代码都在局部视图中,这是否意味着$.post()将把上面所有的代码加载到<div>中,导致上面的第二个副本嵌套在自己内部?当超时运行时,它会继续在自身内部嵌套越来越多的副本。

我建议您将上述所有内容移动到您的主视图中,然后部分视图应该只返回您想要在<div>中看到的任何文本(而不是JavaScript)。

(如果这不是我引用的语句的意思,那么请更新您的帖子,以更清楚地解释上述代码的位置以及$.post('@Url.Action("RefreshSelfUpdatingPartial"))实际返回的内容。)

(另外,就像Alex说的,不要将st变量设置为null,然后将其传递给clearTimeout() -尽管我认为您可以删除两行,因为您不需要在它已经触发后清除超时)