2010-02-01 14 views
6

Ich arbeite an einer Website, die jquery modale Dialoge verwendet, um verschiedene Dinge wie Anmeldung und so zu tun.ASP.NET MVC Autorisieren Attribut zum Starten eines modalen?

Jedoch; Wir haben ein kleines Problem mit der Verwendung dieser .. was ist das Attribut [Autorisieren] auf eine Menge unserer Aktion Methoden und so, was passiert ist, wenn der Benutzer nicht angemeldet ist und trifft eine Route, die sie benötigen dafür autorisiert sein zeigt die login-seite wie man es vermutet aber offensichtlich ist das ein modal.

Wie auch immer, kurz, gibt es eine Möglichkeit, ein benutzerdefiniertes Attribut zu erstellen, das das modale anstelle der tatsächlichen Ansicht auslösen kann, die das Login-Modal ausmacht?

+0

Welche Version von ASP.NET MVC verwenden Sie? –

Antwort

5

In diesem Fall können Sie ein benutzerdefiniertes Aktionsfilterattribut verwenden, das ein Popup öffnet, wenn der Benutzer nicht autorisiert ist.
Überprüfen Sie in diesem Aktionsfilter, ob der Benutzer angemeldet ist, und fügen Sie der ViewData-Auflistung einen booleschen Wert hinzu.
Aply das Attribut auf die Aktion des Controllers.
Fügen Sie dann in der Masterseite ein bedingtes Rendering von Code hinzu, das das Popup öffnet.

Der Code für das Attribut:

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

In der Master-Seite oder andere gemeinsame Ansicht hinzufügen bedingten Rendering:

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

Danke das funktioniert perfekt – dswatik

Verwandte Themen