在我的应用程序中,我有几个区域(视图),只有具有某些特权的用户才能访问这些区域(视图)。如果当前登录的用户无权查看给定视图,则应出现一个弹出窗口。此时用户可以提供一些附加信息以查看视图。关键是用户在他/她提供此信息之前不能离开当前视图。到目前为止,我认为我可以这样做。首先,我定义了自定义 AuthorizeAttribute。该属性应用于负责保护受限视图的控制器。我的属性看起来像这样
public class PopupAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session["confirmed"] == null)
{
filterContext.Controller.ViewData["ShowPopup"] = true;
}
else
filterContext.Controller.ViewData["ShowPopup"] = false;
}
}
接下来我修改了 _Layout.cshtml 使其看起来像这样
...
...
<body>
<div id="main">
@{
if ((ViewData[ShowPopup] != null && (bool)ViewData[ShowPopup]))
{
<script type="text/javascript">
showPopUp();
</script>
}
}
<div id="header">
title
</div>
<div id="menu">
@{
Html.RenderAction("TopMenu", "Menu");
}
</div>
<div id="treeView">
@{
Html.RenderAction("TreeMenu", "Tree");
}
</div>
<div id="content">
@RenderBody()
</div>
</div>
</body>
...
...
不幸的是,结果与我预期的不同。现在呈现用户应该无法访问的视图并显示弹出窗口。我试图将当前视图重定向到我的自定义属性中的前一个视图,这样做
public class PopupAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session["confirmed"] == null)
{
filterContext.Controller.ViewData["ShowPopup"] = true;
filterContext.Result =
new RedirectResult(filterContext.RequestContext.HttpContext.Request.UrlReferrer.ToString());
}
else
filterContext.Controller.ViewData["ShowPopup"] = false;
}
}
但是,如果我这样做,我会丢失存储在 ViewData 中的信息。是否有任何优雅或更好的方法来实现此功能。不幸的是,我无法将用户重定向到“正常”页面,这必须在弹出窗口中完成。