Ajax.ActionLink возвращает страницу входа в систему в div, когда пользователю необходимо войти снова - PullRequest
5 голосов
/ 29 ноября 2011

У меня есть Ajax.ActionLink, что приводит к возвращению частичного представления.Однако, если срок действия моего FormsAuthentication истекает, и пользователю необходимо снова войти в систему, вся страница входа возвращается как частичное представление.

В результате полная страница входа в систему отображается в div, который я выделил для частичного просмотра.Таким образом, это выглядит как две веб-страницы на странице.

Я использую атрибут [Authorize] на моем контроллере и действиях.

Как я могу заставить страницу входа возвращаться как полнуюпосмотреть

1 Ответ

5 голосов
/ 29 ноября 2011

Вы можете расширить атрибут [Authorize], чтобы можно было переопределить функцию HandleUnauthorizedRequest для возврата JsonResult на ваш вызов AJAX.

public class AuthorizeAjaxAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext 
                                                      filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            // It was an AJAX request => no need to redirect
            // to the login url, just return a JSON object
            // pointing to this url so that the redirect is done 
            // on the client

            var referrer = filterContext.HttpContext.Request.UrlReferrer;

            filterContext.Result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new { redirectTo = FormsAuthentication.LoginUrl + 
                            "?ReturnUrl=" + 
                             referrer.LocalPath.Replace("/", "%2f") }
            };
        }
        else
            base.HandleUnauthorizedRequest(filterContext);
    }
}

Создание Javascript-функции, обрабатывающей перенаправление:

<script type="text/javascript">
    function replaceStatus(result) {
        // if redirectTo has a value, redirect to the link
        if (result.redirectTo) {
            window.location.href = result.redirectTo;
        }
        else {
            // when the AJAX succeeds refresh the mydiv section
            $('#mydiv').html(result);
        }
    };
</script>

И затем вызовите эту функцию в опции OnSuccess вашего Ajax.ActionLink

Ajax.ActionLink("Update Status", "GetStatus", 
                 new AjaxOptions { OnSuccess="replaceStatus" })
...