Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/03/2004, 11:26
Avatar de lucxx
lucxx
 
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Información Aportación: menú en fichero XML

Hola
Bueno, pues ya va siendo hora de que yo abra un tema por aqui, y creo que esto le puede ser util a mas de uno:

Se trata de crear un control de usuario que muestre el menu de una web a partir de los datos almacenados en un fichero XML. Los datos del fichero XML se almacenarán en la caché del servidor, de esta forma la carga del menú será muy rapida, en lugar de tener que cargar los datos cada vez desde disco, o de una base de datos si los almacenáramos en una base de datos.
Aquí alguno se preguntará porque no introducir las opciones del menu directamente en el control de usuario: pues bien, eso es menos elegante, menos portable, más engorroso de actualizar y además, introduciendo los datos en un fichero XML, podremos administrar el menu desde una página en el panel de control de la web, simplemente cargando el fichero en un dataset y creando las opciones oportunas para modificarlo.

En el ejemplo, supondremos un menú como el de foros del web, es decir un dropDownList con autoPostBack="true" ademas de un botón "ir" que permita realizar la acción en caso de que el autoPostBack no se ejecute en el cliente; esto lo hago por sencillez y también porque me apetece , pero vamos, adaptarlo a un datalist u otra cosa es un ejercicio trivial.


-----------------------------------------------------------------------------------
MENU.ASCX (Control de usuario)
-----------------------------------------------------------------------------------

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>


<script language="VB" runat="server">

Public paginaActual as String


Sub Page_Load(src as Object, e as EventArgs)
if not isPostBack then
call cargarMenu()
end if
End Sub


Public Sub cargarMenu()
Dim datosMenu as DataView
Dim ds as DataSet
Dim fs as FileStream
Dim XMLStream as StreamReader

datosMenu = Cache("dvMenu")
if datosMenu is nothing then
fs = new FileStream(Server.MapPath("menu.xml"), FileMode.Open, FileAccess.Read)
XMLStream = new StreamReader(fs)
ds = new DataSet
ds.ReadXML(XMLStream)
XMLStream.close()
fs.close()

datosMenu = new DataView(ds.Tables(0))
Cache.Insert("dvMenu", datosMenu, new CacheDependency(Server.MapPath("menu.xml")))
end if

' Rellenamos el dropDownList
ddl_menu.DataSource = datosMenu
ddl_menu.DataTextField = "seccion"
ddl_menu.DataValueField = "url"
ddl_menu.DataBind()

' Seleccionamos la página actual (esto probablemente se pueda hacer de forma más eficiente
Dim i as Integer
Dim encontrado as Boolean

i = 0
encontrado = false
while (i < ddl_menu.Items.Count) and (not encontrado)
if ddl_menu.Items(i).Value = paginaActual then
encontrado = true
else
i = i + 1
end if
end while

if encontrado then
ddl_menu.SelectedIndex = i
else
ddl_menu.SelectedIndex = 0
end if

End Sub



Sub click_ddlMenu(src as Object, e as EventArgs)
Response.Redirect(ddl_menu.SelectedItem.Value)
End Sub


Sub click_ir(src as Object, e as ImageClickEventArgs)
Response.Redirect(ddl_menu.SelectedItem.Value)
End Sub

</script>



<asp:dropdownlist ID="ddl_menu"
runat="server"
AutoPostBack="true"
OnSelectedIndexChanged="click_ddlMenu" />

<asp:imagebutton ID="ib_ir"
ImageUrl="images/bot_ir.gif"
OnClick="click_ir"
runat="server"/>


' A esta última parte cada uno que le de el formato que quiera, yo solo pongo los controles necesarios

-----------------------------------------------------------------------------------



y ahora el fichero XML:


-----------------------------------------------------------------------------------
MENU.XML
-----------------------------------------------------------------------------------

<?xml version="1.0" encoding="iso-8859-1"?>
<menu>
<opcion>
<seccion>Principal</seccion>
<url>../principal/principal.aspx</url>
</opcion>
<opcion>
<seccion>Insertar</seccion>
<url>../insertar/insertar.aspx</url>
</opcion>
<opcion>
<seccion>Modificar</seccion>
<url>../modificar/modificar.aspx</url>
</opcion>
</menu>

-----------------------------------------------------------------------------------

Cada uno que le ponga las secciones que necesite, claro

Bueno, una última observacion: en las url del fichero .xml he metido direcciones relativas, para que esto funcione, el servidor debe estar organizado de forma que, por ejemplo, la dirección relativa de la pagina "principal" sea la misma tanto si estamos en la pagina "insertar" como si estamos en la pagina "modificar" como si estamos en la propia pagina "principal", no se si me entiende, la estructura sería algo como esto

/
|
+- principal/
| |
| +- principal.aspx
|
+- insertar/
| |
| +- insertar.aspx
|
+- modificar/
| |
| +- modificar.aspx
|
+- menu/
|
+- menu.ascx
+- menu.xml

De todas formas, en lugar de url's relativas podrían ponerse url's absolutas, aunque habria que modificarlas si en algun momento cambiamos el host.

Bueno, pues aquí queda, espero que le sirva a alguno

Salu2