2010-02-01 15 views
6

Sto lavorando su un sito che fa uso di finestre di dialogo modali jquery per fare varie cose come l'accesso e così via.ASP.NET MVC Autorizza attributo per l'avvio di una modale?

Tuttavia; abbiamo un piccolo problema con l'uso di questi .. che stiamo usando l'attributo [Autorizza] su molti dei nostri metodi di azione e quindi quello che sta succedendo è se l'utente non è loggato e colpisce una rotta di cui hanno bisogno essere autorizzato per questo mostra la pagina di accesso come si suppone di ma ovviamente questo supponiamo di essere un modale.

Comunque, per farla breve, c'è un modo per creare un attributo di autorizzazione personalizzato che può attivare il modale invece della vista effettiva che costituisce la modal di accesso?

+0

Quale versione di ASP.NET MVC stai usando? –

risposta

5

In questo caso è possibile utilizzare un attributo del filtro azione personalizzato che apre un popup se l'utente non è autorizzato.
In questo filtro azione è sufficiente verificare se l'utente è connesso e aggiungere un valore booleano alla raccolta ViewData.
Applica l'attributo all'azione del controller.
Quindi nella pagina master aggiungere il rendering condizionale del codice che apre il popup.

Il codice per l'attributo:

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

Nella pagina master o un altro punto di vista comune aggiungere resa condizionale:

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

Grazie funziona perfettamente – dswatik

Problemi correlati