当我的会话即将在.net Mvc。
中清除时,我必须显示一个弹出窗口例如:enter link description here
我想在Mvc中使用同样的东西......我该怎么做???
这里我尝试了一些代码:
这是控制器页面(ClientScript不存在时出错):
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>
答案 0 :(得分:2)
首先获取用户会话的超时时间:
int sessionTimeout = HttpContext.Current.Session.Timeout;
DateTime timeoutDate = DateTime.Now.AddMinutes(sessionTimeout);
您可以通过模型或ViewBag将其传递给您的视图,并使用javascript计时器弹出警报。 (由于会话在每次请求时都会刷新,这将是一个准确的超时)。
查看:
@{
int milliseconds = (int)ViewBag.sessionTimeout * 60 * 1000;
}
setTimeout(function(){alert("SessionPop!");}, @milliseconds.ToString());
但是,由于会话在刷新控制器操作时会刷新,因此您可能希望提供实时支持(特别是如果您的应用程序将在多个选项卡中使用或大量使用AJAX调用)。您可以考虑使用SignalR在新会话超时到期时实时更新。
答案 1 :(得分:0)
AFAIK,MVC控制器在将脚本内容传递到视图时不需要ClientScript.RegisterClientScriptBlock
。您只需使用ViewBag
/ ViewData
和Html.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?