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)
Y en nuestro sector de administracion queremos algo asi
La demo consta de
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
- Páginas personalizadas (por Eugenio Estrada Csaky)
- Personalizando las aplicaciones Web (Final) (por Eugenio Estrada Csaky)
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
- Acceder a propiedades/atributos de secciones del web.config mediante codebehind
- Información general sobre temas y máscaras de ASP.NET
- Cómo: Definir temas de páginas ASP.NET
- Cómo: Leer las cadenas de conexión en un archivo Web.config
- WebConfigurationManager.OpenWebConfiguration
Abre el archivo de configuración de la aplicación Web como un objeto Configuration utilizando la ruta de acceso virtual especificada para permitir operaciones de lectura o escritura.
- Utilizar las clases Configuration
tienes el codigo para C#, seria de gran ayuda
Hola @German
Lamentablemente no tengo el codigo en C#, en ese momento me inspire en VB.NET; pero como veras no son muchas lineas de codigo asi que podrias ir a algunos e los enlaces que te envio mas abajo para «tratar de convertirlo»
http://www.developerfusion.com/tools/convert/csharp-to-vb/
http://www.carlosag.net/Tools/CodeTranslator/
http://www.kamalpatel.net/ConvertCSharp2VB.aspx
Espero que te sirva de ayuda o guia…