如果会话在 mvc 中过期,则从 ActionFilter 显示弹出窗口
Show popup from ActionFilter if session expires in mvc
我们使用 mvc 创建了一个网站,其中我有 3 个控制器:
AccountController
HomeController
ContactController
我们在 ActionFilters 中编写了自定义授权,我们正在其中检查会话是否已过期。如果会话过期,我们将重定向到登录页面。这是 ActionFilter 中的代码:
public override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.User;
var UserProcesses = HttpContext.Current.Session["UserProcesses"] != null ? ((List<string>)HttpContext.Current.Session["UserProcesses"]) : null;
var currentRequest = filterContext.ActionDescriptor.ActionName.ToLower();
var currentController = filterContext.RouteData.Values["controller"].ToString();
if (!string.IsNullOrEmpty(currentController))
{
switch (currentController.ToLower())
{
case "home":
{
if (UserProcesses == null)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
Controller = "Account",
Action = "Login"
})
);
}
break;
case "contact":
{
if (UserProcesses == null)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
Controller = "Account",
Action = "Login"
})
);
}
break;
}
}
}
这非常有效,即当会话过期并且用户单击网站上的任何 link 时,他将被重定向到地址为
的登录页面
http://websitename/Account/Login
但是现在我们想在页面上显示一个弹出窗口(用户所在的任何页面),它将显示消息 "That session has expired" 并且在关闭该弹出窗口时,用户将被重定向到登录页面。
我不知道如何从 ActionFilter 本身调用 Jquery 弹出窗口。我在网上搜索了很多解决方案,但找不到正确的解决方案。有人建议使用 HandleUnauthorizedRequest 来调用 Action 方法 (Call RedirectToAction from ActionFilter)。但是,我很困惑是只使用 HandleUnauthorizedRequest 还是在我的代码中同时使用它和 OnAuthorization 。有人可以提出解决方案吗?
注意: 我有一个通用视图,其中我可以保留 html 弹出窗口以在整个网站上使用。
我正在考虑一个使用变量的解决方案,并且根据该变量,您会显示或不显示弹出窗口。
我懒得实际编写代码,但我发现了描述解决方案的 link :
ASP.NET MVC Authorize Attribute to launch a modal?
还有另一种方法可以解决它,即只需转到 _Layout.cshtml
文件并输入以下代码:
<script type="text/javascript">
jQuery(document).ready(function () {
var SessionValue = '@Request.RequestContext.HttpContext.Session["YourSessionKey"]';
if (SessionValue == "") {
alert("your session is expired please try to Re-login");
javascript: document.getElementById('logoutForm').submit();
}
});
</script>
其中 logoutForm
是 _Layout.cshtml
中注销表单的 ID。
我们使用 mvc 创建了一个网站,其中我有 3 个控制器:
AccountController
HomeController
ContactController
我们在 ActionFilters 中编写了自定义授权,我们正在其中检查会话是否已过期。如果会话过期,我们将重定向到登录页面。这是 ActionFilter 中的代码:
public override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.User;
var UserProcesses = HttpContext.Current.Session["UserProcesses"] != null ? ((List<string>)HttpContext.Current.Session["UserProcesses"]) : null;
var currentRequest = filterContext.ActionDescriptor.ActionName.ToLower();
var currentController = filterContext.RouteData.Values["controller"].ToString();
if (!string.IsNullOrEmpty(currentController))
{
switch (currentController.ToLower())
{
case "home":
{
if (UserProcesses == null)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
Controller = "Account",
Action = "Login"
})
);
}
break;
case "contact":
{
if (UserProcesses == null)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
Controller = "Account",
Action = "Login"
})
);
}
break;
}
}
}
这非常有效,即当会话过期并且用户单击网站上的任何 link 时,他将被重定向到地址为
的登录页面http://websitename/Account/Login
但是现在我们想在页面上显示一个弹出窗口(用户所在的任何页面),它将显示消息 "That session has expired" 并且在关闭该弹出窗口时,用户将被重定向到登录页面。
我不知道如何从 ActionFilter 本身调用 Jquery 弹出窗口。我在网上搜索了很多解决方案,但找不到正确的解决方案。有人建议使用 HandleUnauthorizedRequest 来调用 Action 方法 (Call RedirectToAction from ActionFilter)。但是,我很困惑是只使用 HandleUnauthorizedRequest 还是在我的代码中同时使用它和 OnAuthorization 。有人可以提出解决方案吗?
注意: 我有一个通用视图,其中我可以保留 html 弹出窗口以在整个网站上使用。
我正在考虑一个使用变量的解决方案,并且根据该变量,您会显示或不显示弹出窗口。 我懒得实际编写代码,但我发现了描述解决方案的 link :
ASP.NET MVC Authorize Attribute to launch a modal?
还有另一种方法可以解决它,即只需转到 _Layout.cshtml
文件并输入以下代码:
<script type="text/javascript">
jQuery(document).ready(function () {
var SessionValue = '@Request.RequestContext.HttpContext.Session["YourSessionKey"]';
if (SessionValue == "") {
alert("your session is expired please try to Re-login");
javascript: document.getElementById('logoutForm').submit();
}
});
</script>
其中 logoutForm
是 _Layout.cshtml
中注销表单的 ID。