Il controllo LoginView permette di presentare template differenti in base all'autenticazione o all'appartenenza di un utente ad un determinato ruolo.
In certi scenari l'utilizzo di questo controllo risulata macchinoso, vista la necessità di ricorrerre al metodo FindControl per recuperare le istanze dei controlli contenute nei template.
Sfuttando come base i controlli MultiView e View è possibile ricreare le stesse funzionalità del control LoginView superandone i limiti.
Per prima cosa ci occuperemo di creare un controllo RoleView estendendo la classe View, aggiugendo una proprietà Role per specificare il ruolo associato alla vista:
public string Role { get { return _role; } set { _role = value;} }
Successivamente rendiamo visibile il controllo solo se l'utente che richiede la pagina appartiene al ruolo specificato:
public override bool Visible { get { if (Parent != null && !this.DesignMode) { if (this.Parent.Visible) { if (this.Page.User.IsInRole(Role)) { _active = true; return true; } else { _active = false; return false; } } return false; } return true; } }
Infine creiamo due metodi wrapper che permetteranno al controllo MultiRoleView di lanciare rispettivamente l'evento di attivazione e disattivazione del controllo View:
internal void OnRoleViewActivate(EventArgs e) { OnActivate(e); } internal void OnRoleViewDeactivate(EventArgs e) { OnDeactivate(e); }
Passiamo alla creazione del controllo MultiRoleView, aggiungendo per prima cosa la proprietà ActiveViews, al fine di contenere le viste attive.
public Collection<View>ActiveViews { get { EnsureActiveView(); return _activeViewCollection; } }
La proprietà richiama il metodo EnsureActiveView che scorrendo la collezione originale Views recupera i controlli RoleView visibili preparandoli per il rendering:
private void EnsureActiveView() { if (_activeViewCollection == null) { _activeViewCollection = new Collection<View>(); foreach (View v in Views) { RoleView rw = v as RoleView; if (rw != null) { if (rw.Visible) { _activeViewCollection.Add(rw); rw.OnRoleViewActivate(EventArgs.Empty); rw._active = true; } else { if (rw._active) { rw.OnRoleViewDeactivate(EventArgs.Empty); rw._active = false; } } } else { _activeViewCollection.Add(v); } } } }
Infine eseguiamo l'override del metodo Render per renderizzare tutte le viste attive:
protected override void Render(HtmlTextWriter writer) { //per ogni vista renderizzo il contenuto foreach (View v in ActiveViews) { v.RenderControl(writer); } }
Per utilizzare i nuovi controlli è sufficente aggiungere le classi nella cartella App_Code, piuttosto che creare una class library, e procedere alla registrazione.
Ulteriori dettagli sono contenuti nella soluzione d'esempio allegata alla script.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare il throttling in ASP.NET Core
Taggare la output cache in base al routing in ASP.NET Core
Load test di ASP.NET Core con k6
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Short-circuiting della Pipeline in ASP.NET Core
Cache policy su route groups di Minimal API in ASP.NET Core 7
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
I più letti di oggi
- Evitare il flickering dei componenti nel prerender di Blazor 8
- Rilasciata la Beta 2 di Visual Studio 2008
- tra pochi minuti inizia la keynote della seconda giornata. seguila live su http://aspitalia.com/mix-11 #mix11
- .@dbochicchio ora su #aspnetcore 2 a #netconfit https://aspit.co/netconf-17
- Utilizzare angular-cli per creare una direttiva in Angular 2
- Windows Vista: il ritorno di WinFS con la beta1
- .@CristianCivera tra poco su #azure con i suoi tips&tricks per lo sviluppatore web: https://aspit.co/web15-live #aspilive
- Le novità di C# 10