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

时间:2014-12-17 12:40:09

标签: javascript c# asp.net-mvc timer

我的web.config中有会话过期时间,如果用户尝试使用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同步,但我不知道如何... < / p>

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,但它仍然无效,有什么新的建议吗?此外,我意识到我还应该在此eqatuation中包含httpGet请求。

2 个答案:

答案 0 :(得分:1)

您可以处理每个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) {

        }
    });
});

答案 1 :(得分:0)

您可以处理每个ajax响应并检查403代码即 - 未授权。 如果没有授权,那么你必须重置你的时间