javascript - 如何在我的 mvc 项目中同步这两个计时器?

标签 javascript c# asp.net-mvc timer

我的 web.config 中有这个 session 过期时间,只有当用户尝试 HttpPost 时才会在过期时重定向,我猜它会在每次 HttpPost 后重置计时器:

<system.web>
<sessionState mode="InProc" timeout="60" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<authentication mode="Forms">
  <forms loginUrl="~/Login/Login"></forms>
</authentication>

我的 _Layout.cshtml 中有这个 javascript 代码,如果用户空闲,它将重定向到登录,我在这里大胆猜测它会在 ajaxcall 后重置:

<script type="text/javascript">
    $(function () {
        var _redirectTimeout = 60 * 60 * 1000;
        var _redirectUrl = '@Url.Action("Logout", "Login")';

        var _redirectHandle = null;

        function resetRedirect() {
            if (_redirectHandle) clearTimeout(_redirectHandle);
            _redirectHandle = setTimeout(function () {
                window.location.href = _redirectUrl;
            }, _redirectTimeout);
        }
//EDIT1
$(document).ajaxComplete(function (event, request, settings) {
if(request.status === 403) {
   // reset timer
//resetRedirect();
 window.location.href = _redirectUrl; //Im a dumbass, It should be this but it still doesnt work...
}
});

        /*$.ajaxSetup({
            complete: function () {
                resetRedirect();

            }
        });*/ // reset idle redirect when an AJAX request completes
        resetRedirect(); // start idle redirect timer initially.
    });
</script>

这使得我的两个计时器(均为 60 分钟)异步,知道如何解决这个问题吗?我认为我应该使 javascript 与 HttpPost 同步,但我不知道如何...

EDIT1 我根据 JesseJames 的建议编辑了上面的 java 脚本代码,并尝试使用下面的代码对其进行测试,但是 resetRedirect();只是不触发:

$('.save-table').on('click', function () {
                var tr = $(this).parents('tr:first');
                var PredefName = tr.find("#PredefName").val();
                var PredefDescription = tr.find("#PredefDescription").val();
                var PredefID = tr.find("#PredefID").html();
                tr.find("#lblPredefName").text(PredefName);
                tr.find("#lblPredefDescription").text(PredefDescription);
                tr.find('.edit-mode, .display-mode').toggle();

                $.ajax({
                    url: '/PredefinedViews/Update/',
                    data: JSON.stringify({ pID: PredefID, pName: PredefName, pDescript: PredefDescription }),
                    type: 'POST',
                    //dataType: "json",
                    contentType: 'application/json; charset=utf-8',
                    //success: function (data) {
                    //    alert(data);
                    //}
                    //error: function (response) {
                    //    alert(response.responseText);
                    //},
                });
            });

我什至尝试用 ajaxError 代替 ajaxComplete 但它仍然不起作用,有什么新建议吗?我还意识到我还应该在此等式中包含 httpGet 请求。

最佳答案

您可以处理每个 ajax 响应并检查其是否有 401 代码,这意味着 - 未授权。然后重置计时器。

$(document).ajaxComplete(function (event, request, settings) {
   if(request.status === 401) {
       // reset timer
   }
});

您可以尝试处理其他 AJAX 事件:

Global ajax event handlers in JQuery

我的项目示例:

$(document).ready(function(){
    $(document).ajaxError(function (event, jqxhr, settings, exception) {
        if (jqxhr.status == 401) {

        }
    });
});

关于javascript - 如何在我的 mvc 项目中同步这两个计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27525870/

相关文章:

javascript - 鼠标事件未在 html5 Canvas 上触发

c# - 在 C# 中插入单引号时出现异常

c# - 将 byte[] 数组转换为 DataTable

jquery - 使用 Jquery 无需进入服务器即可更改按钮的图像

javascript - 计算 fps 的函数

javascript - 在 JSON 中循环数组

c# - 如何通过一个处理程序处理多个事件源

asp.net-mvc - 阻止 bingbot 抓取我的网站

asp.net-mvc - 在MVC中记录错误(已处理和未处理)的最佳实践

javascript - 在路径上绘制 SVG 图像,但大小根据需要而定