【问题标题】:Detect Session Timeout and display popup when session is about to clear in mvc当会话即将在 mvc 中清除时检测会话超时并显示弹出窗口
【发布时间】:2023-03-22 16:46:01
【问题描述】:

当我的会话即将在 .net MVC 中清除时,我必须显示一个弹出窗口。

example

我想在 MVC 中实现同样的东西。我该怎么办???

这里我尝试了一些代码:

这是控制器页面(错误来自客户端脚本不存在):

   Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
        SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
        int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
        ClientScript.RegisterClientScriptBlock(this.GetType(),"SessionAlert", "SessionExpireAlert(" + timeout + ");", true);

这是我在视图中的脚本(我从控制器调用):

<script type="text/javascript">
function SessionExpireAlert(timeout) {
    var seconds = timeout / 1000;
    document.getElementsByName("secondsIdle").innerHTML = seconds;
    document.getElementsByName("seconds").innerHTML = seconds;
    setInterval(function () {
        seconds--;
        document.getElementById("seconds").innerHTML = seconds;
        document.getElementById("secondsIdle").innerHTML = seconds;
    }, 1000);
    setTimeout(function () {
        //Show Popup before 20 seconds of timeout.
        $find("mpeTimeout").show();
    }, timeout - 20 * 1000);
    setTimeout(function () {
        window.location = "Expired.aspx";
    }, timeout);
};
function ResetSession() {
    //Redirect to refresh Session.
    window.location = window.location.href;
}
</script>

【问题讨论】:

  • 恐怕你做不到。页面对象可以在 web 表单中调用,因为服务器端代码是紧密耦合的,但你不能使用 mvc 来做到这一点
  • why???如何在mvc中做..我认为必须有任何方法可以做到这一点..如果你有任何解决方案告诉我..
  • 您可以使用 JQuery javascript 库并触发 ajax 请求,并在成功处理程序中执行您需要的操作。
  • 你能写下做这个操作的代码吗
  • 是的,在那之前..我想知道上面的控制器代码是否存在于控制器的操作方法或构造函数中?

标签: asp.net-mvc asp.net-mvc-4 session


【解决方案1】:

首先获取用户会话的超时时间:

int sessionTimeout = HttpContext.Current.Session.Timeout;
DateTime timeoutDate = DateTime.Now.AddMinutes(sessionTimeout);

您可以通过 Model 或 ViewBag 将其传递给您的视图,并使用 JavaScript 计时器弹出警报。 (由于每次请求都会刷新会话,这将是一个准确的超时)。

查看:

@{
    int milliseconds = (int)ViewBag.sessionTimeout * 60 * 1000;
}
setTimeout(function(){alert("SessionPop!");}, @milliseconds.ToString());

但是由于会话会在点击控制器操作时刷新,您可能希望提供实时支持(尤其是如果您的应用将在多个选项卡中使用或大量使用 AJAX 调用)。当新的会话超时对用户到期时,您可以考虑使用 SignalR 实时更新。

【讨论】:

    【解决方案2】:

    AFAIK,MVC 控制器在将脚本内容传递到视图时不需要ClientScript.RegisterClientScriptBlock。您可以像这样使用ViewBag/ViewDataHtml.Raw 注册脚本块,只需确保控制器返回包含ViewBag/ViewData 的视图:

    public ActionResult WarnTimeout()
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
        SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
        int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
        ViewBag.Script = "\r\n<script type='text/javascript'>\r\nSessionExpireAlert(" + timeout + ");\r\n</script>\r\n");
    
        return View();
    }
    
    // View (use Html.Raw to include script tag into view)
    @Html.Raw(ViewBag.Script)
    
    <script type="text/javascript">
    function SessionExpireAlert(timeout) {
        var seconds = timeout / 1000;
        document.getElementsByName("secondsIdle").innerHTML = seconds;
        document.getElementsByName("seconds").innerHTML = seconds;
        setInterval(function () {
            seconds--;
            document.getElementById("seconds").innerHTML = seconds;
            document.getElementById("secondsIdle").innerHTML = seconds;
        }, 1000);
        setTimeout(function () {
            //Show Popup before 20 seconds of timeout.
            $find("mpeTimeout").show();
        }, timeout - 20 * 1000);
        setTimeout(function () {
            // when using MVC, you may use Url.Action instead of providing ASPX relative path
            window.location = "@Url.Action("Expired", "Controller")";
        }, timeout);
    };
    function ResetSession() {
        //Redirect to refresh Session.
        window.location = window.location.href;
    }
    </script>
    

    或者,可以使用提供某些数据的 jQuery ajax 调用 ($.ajax({ ... })),然后在 success 部分中设置所需的警报框操作。

    欢迎提出任何建议。

    参考类似问题:

    How do I warn the user that their web session is about to time out?

    【讨论】:

    • 我想 Html.Raw 只会将您的脚本注册到视图中,但不会触发脚本。为此,如果用户使用 get postback,您必须在页面加载时显式触发。您的替代解决方案更好处理
    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 2014-09-24
    • 2013-06-21
    • 1970-01-01
    • 2015-08-10
    • 2018-03-10
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多