lunes, 12 de mayo de 2008

Cambiar master page dinamicamente

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.
474999186719169042

No hay comentarios.: