Возврат к контроллеру, который генерирует вызов, когда выброшено неавторизованное событие

0

Моя цель - показать модальный диалог в представлении, когда вызывается событие 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? Или есть ли другой способ показать модальное всплывающее окно при возникновении несанкционированного события?

  • 0
    Возможно, я делаю что-то не так, пытаясь достичь цели, и есть лучший подход для создания модальных диалогов / представлений из неавторизованных событий.
Теги:
asp.net-mvc
asp.net-mvc-4

1 ответ

0
Лучший ответ

Я нашел способ достичь цели.

Я использовал сеанс для хранения информации о неавторизованном событии в моем пользовательском 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">&times;</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 -->

    }

Теперь модальное представление отображается только при поднятии несанкционированного события, и оно отображается на странице, которая генерирует запрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню