Моя цель - показать модальный диалог в представлении, когда вызывается событие Unathorized. Я переопределяю метод OnAuthorization своего настраиваемого авторизованного атрибута, как этот пост:
ASP.NET MVC - Как показать несанкционированную ошибку на странице входа?
Но проблема в том, что TempData отправляется неавторизованному контроллеру (ClientController), и это не является желаемым поведением.
Мне нужно: вызвать Home/Index/ToClientes и когда он пытается получить Client/Index, покажите Modal Dialog на Home/Index, чтобы сообщить пользователю о несанкционированном событии.
[HttpPost]
public ActionResult ToClientes()
{
return RedirectToAction("Index", "Client");
}
В настоящее время TempData считывается внутри ClientController, мне нужно будет прочитать его на HomeController, чтобы показать модальное всплывающее представление, объясняющее ошибку.
Мой метод переопределения OnAuthorization аналогичен методу, указанному в ссылке
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private bool _isAuthorized;
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
_isAuthorized = base.AuthorizeCore(httpContext);
return _isAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if(!_isAuthorized)
{
filterContext.Controller.TempData.Add("RedirectReason", "Unauthorized");
}
}
}
Нужно ли отправлять TempData контроллеру, который вызвал функцию, но не тот, который генерирует метод onAuthorization? Или есть ли другой способ показать модальное всплывающее окно при возникновении несанкционированного события?
Я нашел способ достичь цели.
Я использовал сеанс для хранения информации о неавторизованном событии в моем пользовательском AuthorizeAtributte в HandleUnauthorizedRequest
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.HttpContext.Session["OpenAuthorizationPopup"] = "true";
filterContext.Result = new RedirectResult(filterContext.Controller.TempData["urlOrigen"].ToString());
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
ФильтрContext.Result необходим, чтобы избежать выполнения кода внутри несанкционированной функции.
Затем в общей компоновке всех представлений я добавил код JS
@if ((Session["OpenAuthorizationPopup"] ?? "false") == "true")
{
Session["OpenAuthorizationPopup"] = "false";
<script type="text/javascript">
$(document).ready(function () {
$('#myModal').modal('show');
});
</script>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
}
Теперь модальное представление отображается только при поднятии несанкционированного события, и оно отображается на странице, которая генерирует запрос.