ASP.NET MVC Authorize Attribute для запуска модального режима? - PullRequest
6 голосов
/ 01 февраля 2010

Я работаю над сайтом, который использует модальные диалоги jquery для выполнения различных действий, таких как вход в систему и т. Д.

Тем не менее, у нас есть одна небольшая проблема с использованием этих .., которая заключается в том, что мы используем атрибут [Authorize] во многих наших методах действий, и поэтому происходит, если пользователь не вошел в систему и не нашел нужный ему маршрут быть авторизованным, поскольку он показывает страницу входа в систему так, как это предполагается, но, очевидно, это должно быть модальным.

Как бы то ни было, есть ли способ создать пользовательский атрибут авторизации, который может запускать модальное состояние вместо фактического представления, составляющего модальное имя входа?

1 Ответ

5 голосов
/ 01 февраля 2010

В этом случае вы можете использовать атрибут фильтра настраиваемых действий, который открывает всплывающее окно, если пользователь не авторизован.
В этом фильтре действий просто проверьте, вошел ли пользователь в систему, и добавьте логическое значение в коллекцию ViewData.
Примените атрибут к действию контроллера.
Затем на главной странице добавьте условный рендеринг кода, который открывает всплывающее окно.

Код для атрибута:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class PopupAuthorizeAttribute : AuthorizeAttribute
{
    private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
    {
        validationStatus = this.OnCacheAuthorization(new HttpContextWrapper(context));
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool isAuthorized = false;
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
        if (this.AuthorizeCore(filterContext.HttpContext))
        {
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            cache.SetProxyMaxAge(new TimeSpan(0L));
            cache.AddValidationCallback(new HttpCacheValidateHandler(this.CacheValidateHandler), null);
            isAuthorized = true;
        }

        filterContext.Controller.ViewData["OpenAuthorizationPopup"] = !isAuthorized;
    }
}

На главной странице или в другом общем представлении добавьте условное отображение:

<% if((bool)(ViewData["OpenAuthorizationPopup"] ?? true)) { %>
 ...Your code to open the popup here...
<% } %>
...