【问题标题】:redirect view after timeout超时后重定向视图
【发布时间】:2017-08-02 23:31:18
【问题描述】:

我有一个视图索引,从 EnqueteController 中的索引操作调用,其中包含我所有的 javascript 代码。这个视图 RenderPartial 是一个表单,_EnqueteForm,它包含我所有的表单输入。在我的 javascript 部分(在索引中)我有以下内容:

@section Scripts{

<script type="text/javascript">

var IDLE_TIMEOUT = 10; //seconds
var _idleSecondsCounter = 0;
document.onclick = function () {
    _idleSecondsCounter = 0;
};
document.onmousemove = function () {
    _idleSecondsCounter = 0;
};
document.onkeypress = function () {
    _idleSecondsCounter = 0;
};
window.setInterval(CheckIdleTime, 1000);

function CheckIdleTime() {
    _idleSecondsCounter++;
    if (oPanel)
        oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
    if (_idleSecondsCounter >= IDLE_TIMEOUT) {
        $.ajax({
            cache: false,
            url: '/Enquete/Inactive',
            type: 'POST',
            dataType: "json",
            data: $('form').serialize(),
        });
    }
}

}

在 10 秒不活动后,它会从 Enquete Controller 调用 Inactive 操作。

此操作如下所示:

    [HttpPost]
    public ActionResult Inactive([System.Web.Http.FromBody] InfoFormulaireEnqueteModele m)
    {
        int userId = this.UserId();

        LibraryEnquete.EnregistrerFormulaire(m, userId);
        TransitionEtatPrecedent(m.HevEvenementID, userId);
        return View("Logout");
    }

我的操作在 10 秒后被正确调用,它正在调用 LibraryEnquete.EnrigistrerFormulaire 和 TransitionEtatPrecedent。但我的问题是:

1) 它不会更改为“注销”视图

2) 出于某种原因,我的 Inactive 方法是从其他页面调用的?!一次调用后,我停止应用程序,一旦我重新启动它,从主页(不是 EnqueteController 索引页面),它会调用 Inactive 方法 20 次,直到我停止应用程序

【问题讨论】:

  • 您在 ajax 成功回调中没有做任何事情(例如,使用您的方法返回的视图更新 DOM)。但听起来你想重定向到另一个视图(ajax 调用从不重定向 - 重点是保持在同一页面上)
  • 你知道我的 Inactive 方法是如何从不同控制器的操作视图中一次又一次地调用的吗?
  • 对不起,它真的不清楚你想在这里做什么。你的 LibraryEnquete.EnregistrerFormulaire()TransitionEtatPrecedent() 方法是做什么的。为什么仅仅因为页面处于非活动状态而调用一个执行某些操作的方法? (这似乎与您的 previous question 相关,您试图在用户不知情的情况下保存数据 - 不要那样做!)
  • 我正在实现一个很长的表单。以前我试图保存它的草稿(现在正在工作,谢谢!)但是现在,如果表单在 2 小时内处于非活动状态(现在是 10 秒用于测试目的),我想保存表单(EnregistrerFormulaire)和将表单状态设置为之前的状态(就像一个状态机,定义表单何时打开以及由谁以及可以对表单执行何种操作)

标签: ajax asp.net-mvc forms


【解决方案1】:

Ajax 调用不处理重定向响应(http 状态代码 3xx)。

通过将视图返回给 ajax 调用,您只是在 ajax 成功事件处理程序中将视图呈现为字符串。

为了让浏览器呈现注销视图,您可以继续提交表单而不使用 ajax:

if (_idleSecondsCounter >= IDLE_TIMEOUT) {
    $('form').submit();
}

如果表单的操作不是指向/Enquete/Inactive,您可以在提交表单之前更改操作:

if (_idleSecondsCounter >= IDLE_TIMEOUT) {
    $('form').prop('action', '/Enquete/Inactive');
    $('form').submit();
}

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2013-11-09
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2015-09-16
    相关资源
    最近更新 更多