В моем приложении у меня есть несколько областей (представлений), которые должны быть доступны только для тех пользователей, у которых есть определенные привилегии. ЕСЛИ текущий зарегистрированный пользователь не имеет прав на просмотр данного представления, должно появиться всплывающее окно. В этот момент пользователь может предоставить некоторую дополнительную информацию, чтобы увидеть представление. Дело в том, что пользователь не может покинуть текущее представление, пока не предоставит эту информацию. Пока я думаю, что мог бы сделать это таким образом. Прежде всего я определил пользовательский 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. Есть ли какой-нибудь элегантный или лучший способ добиться этой функциональности. К сожалению, я не могу перенаправить пользователя на «нормальную» страницу, это нужно сделать во всплывающем окне.