2010-02-01 17 views
6

Estoy trabajando en un sitio que hace uso de los cuadros de diálogo modales jquery para hacer varias cosas, como iniciar sesión y tal.ASP.NET MVC Authorize Attribute para iniciar un modal?

Sin embargo

; tenemos un pequeño problema con el uso de estos ... que es que estamos utilizando el atributo [Autorizar] en muchos de nuestros métodos de acción y, por lo tanto, lo que está sucediendo es que el usuario no haya iniciado sesión y llegue a la ruta que necesita para Estará autorizado para que muestre la página de inicio de sesión como se supone que debe, pero obviamente se supone que es un modal.

En resumen, ¿hay alguna manera de crear un atributo de autorización personalizado que pueda desencadenar el modal en lugar de la vista real que conforma el modo de inicio de sesión?

+0

¿Qué versión de ASP.NET MVC está usando? –

Respuesta

5

En este caso, puede usar un atributo de filtro de acción personalizado que abre una ventana emergente si el usuario no está autorizado.
En este filtro de acción solo verifica si el usuario está conectado y agrega un valor booleano a la colección ViewData.
Aplique el atributo en la acción del controlador.
Luego, en la página maestra agregue la representación condicional de código que abre la ventana emergente.

El código para el atributo:

[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; 
    } 
} 

En la página maestra u otro punto de vista común añadir prestación condicional:

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

Gracias, esto funciona perfectamente – dswatik

Cuestiones relacionadas