Hay casos en los que no es suficiente contar con una sola master page, sino que de acuerdo al rol y/o a la zona a la que estemos accediendo /o a una determinada situación ... es necesario cambiar la master page. En este artículo vamos a ver cómo hacemos eso mediante un ejemplo bastante didáctico.
El ejercicio consta de lo sgte:
Tenemos una aplicación web que consta de dos master pages: site1.master y site2.master...y tres páginas aspx: default.aspx, usuario.aspx y admin.aspx...y un archivo de tipo clase llamado paginaBase.vb (dentro de App_Code) que hereda de la Clase Page. De esta clase heredarán las páginas usuario.aspx y admin.aspx...
Esta clase será precisamente quien se encargue de decidir qué master page usa cada página... La respuesta para cambiar la master page está en asignarle la master page que se desea usar... pero en el evento Page_PreInit.... vean el código:
Imports System
Imports System.Web.UI
Public Class PaginaBase
Inherits Page
Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
If Session("xxx") = "Admin" Then
Me.MasterPageFile = "~/site1.master"
ElseIf Session("xxx") = "Usuario" Then
Me.MasterPageFile = "~/site2.master"
End If
End Sub
End Class
La aplicación inicia con default.aspx y muestra un dropdownlist (con AutoPostBack=True) con las opciones de elegir si ingresar a la zona de usuarios o de administradores... cada zona tiene su propio master page.
HTML (default.aspx):
[asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"]
[asp:ListItem Text="Ingresar como..."][/asp:ListItem]
[asp:ListItem Text="Usuario"][/asp:ListItem]
[asp:ListItem Text="Admin"][/asp:ListItem]
[/asp:DropDownList]
Code-Beside (default.aspx.vb):
Protected Sub DropDownList1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DropDownList1.SelectedIndexChanged
If DropDownList1.Text = "Usuario" Then
'la variable de sesión guarda el valor USUARIO
Session("xxx") = "Usuario"
Response.Redirect("usuario.aspx")
ElseIf DropDownList1.Text = "Admin" Then
'la variable de sesión guarda el valor ADMIN
Session("xxx") = "Admin"
Response.Redirect("admin.aspx")
End If
End Sub
Code-Beside (Admin.aspx.vb):
Partial Public Class admin
Inherits PaginaBase
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class
Code-Beside (Usuario.aspx.vb):
Partial Public Class Usuario
Inherits PaginaBase
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class
En otras palabras, no hay código en las páginas usuario.aspx ni admin.aspx... simplemente se les hace heredar de PaginaBase y listo... cuando las páginas se carguen ... llamarán al evento Page_PreInit de PaginaBase ... y ella hará todo el trabajo.
Descargar el código fuente.
No hay comentarios.:
Publicar un comentario