Cambiar tema actual (app_theme) del web.config desde codebehind

Cuando se necesita cambiar el tema actual de un sitio web, teniendo en cuenta los temas disponibles localmente (tambien podemos tener temas globales pero eso es otro tema) o sea en el App_Theme deberiamos en un sector administrativo (el famoso sector privado) poder tener control de los temas (carpetas en App_Themes) para seleccionar y luego modificarlo permanentemente en el web.config

La idea…

Si tenemos un website de ejemplo con unos Themes (si lo quieres descargar al ejemplo click aqui)

image

Y en nuestro sector de administracion queremos algo asi

image 

La demo consta de

image

 

 

 

Obtener Listado de Temas Locales a la aplicación web

Aqui solamente tendremos que listar los directorios en la carpeta App_Themes (para temas locales). Nos ayudamos con una funcion compartida (shared) o metodo de clase…

Public Shared Function TemasListado() As List(Of String)
       Dim temas As New List(Of String)

       'Enumerar
       If (Directory.Exists(Current.Server.MapPath("~/App_Themes"))) Then
           Dim subDirectorios() As String = Directory.GetDirectories(Current.Server.MapPath("~/App_Themes"))
           For Each d As String In subDirectorios
               Dim dirInfo As New DirectoryInfo(d)
               temas.Add(dirInfo.Name)
           Next
       End If
       Return temas
   End Function

Tendriamos que pensar la estrategia cuando no tengamos temas disponibles.. esa parte lo dejo al lector 🙂

Para luego enlazarla al combo/dropdownlist:

ddlTemas.DataSource = TemasHelper.TemasListado
ddlTemas.DataBind()

ddlTemas.SelectedValue = TemasHelper.TemaActual

y ahora? como Obtener el tema actual?

 

 

Obtener Tema Actual

Aqui podremos consultar a la propiedad Page.Theme, pero como estas cambiando el tema al todo el sitio web (es la idea) tendriamos que obtener el valor desde el web.config. Nuevamente nos ayudamos por una clase helper para consultarla mas “comodamente”

Aqui obtenemos el archivo de configuracion web, la seccion de Pages (PagesSection)

Imports Microsoft.VisualBasic
Imports System.Web.Configuration
Imports System.IO
Imports System.Web.HttpContext
....
Public Shared Function TemaActual() As String
      Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~")
      Dim seccion As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection)
      Return seccion.Theme.ToString
  End Function

         Aqui el articulo de como leer/obtener propiedades de secciones del web.config nos puede ayudar

 


Guardar la modificacion del tema actual

Para guardar… algo parecido al obtener, pero aqui nos ayudamos por los metodos Save y SaveAs. En este caso particular tendremos que modificar con el metodo Save

Imports Microsoft.VisualBasic
Imports System.Web.Configuration
Imports System.IO
Imports System.Web.HttpContext
...
Public Shared Sub TemaCambiar(ByVal tema As String)
       Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") 'WebConfigurationManager.OpenWebConfiguration("/web.config")
       Dim seccion As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection)
       seccion.Theme = tema
       webConfig.Save()
End Sub

 

 

NOTA 1: Temas Local y Tema Global ??

Aqui el ejemplo utilizo temas locales, tambien se puede configurar temas globales, es decir comunes para todos los sitios. Esto se realiza en la carpeta:

       iisdefaultrootaspnet_clientsystem_webversionThemes

Nos podremos ayudar con la propiedad HttpRuntime.AspClientScriptVirtualPath

Aqui un articulo sobre el tema de Luis Ruiz Pavon

 

NOTA 2: Guardar tema en el profile del usuario, y asignar a la pagina actual

Un articulo como personalizar las paginas que nos puede orientar como guardar un tema en el profile del usuario

 

 NOTA 3: Privilegios necesarios

(…from MSDN)Para abrir una sección en un archivo de configuración Web, la aplicación necesita permiso de Lectura para el archivo físico Web.config y para todos sus archivos principales en la jerarquía. Las aplicaciones de código administrado necesitan tener permiso para leer las secciones del sistema. Las aplicaciones de plena confianza y de gran confianza tienen estos permisos de forma predeterminada. En otras palabras, de forma predeterminada, las aplicaciones de media y baja confianza no podrán leer secciones de configuración.(…)

 

 

NOTA 4: Importante! Actualizacion del tema de la pagina para para la peticion actual (idem Nota 2)

Este cambio solamente lo utilizo en el sitio de administracion (fue la idea original), para luego ir al sitio ”Publico” y ver que el cambio se efectuo en el web.config.

No lo vamos a tener disponible hasta la proxima peticion de la pagina. Ya que el tema se enlaza a la pagina en el evento PreInit.

(…)La propiedad Theme debe establecerse antes del evento PreInit; si se establece la propiedad Theme después del evento PreInit, se producirá una excepción InvalidOperationException.(…)

Por eso en el ejemplo, si queremos visualizar el cambio tendriamos que volver a resfrescar…aqui nos ayudamos con un Redirect (pero es una tips simplemente)

Protected Sub btnCambiar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCambiar.Click
        Dim temaNuevo As String = ddlTemas.SelectedValue
        TemasHelper.TemaCambiar(temaNuevo)

        'Para que tome el cambio algo un refresh de la pagina
        Response.Redirect(Request.Path)
End Sub

 

 

Descargar Demo

Si no puedes ver la imagen de descarga click aqui

 

Enlaces

2 comentarios en “Cambiar tema actual (app_theme) del web.config desde codebehind”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *