Foros del Web » Programación para mayores de 30 ;) » .NET »

Aportación: menú en fichero XML

Estas en el tema de Aportación: menú en fichero XML en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/03/2004, 11:26
Avatar de 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
  #2 (permalink)  
Antiguo 31/03/2004, 11:46
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Buen ejemplo lucxx, solo quería tambien mencionar que te faltaría mandar a llamar el namespace System.Web.Caching para poder utilizar el CacheDependency

Saludos
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 31/03/2004, 22:13
Avatar de Mike1304  
Fecha de Ingreso: noviembre-2003
Mensajes: 157
Antigüedad: 20 años, 5 meses
Puntos: 0
muy buena la aportacion...
deberiamos hacer algo parecido en este foro, es decir que podamos aportar link y pequeños codigos utiles para todos
  #4 (permalink)  
Antiguo 01/04/2004, 08:48
Avatar de lucxx  
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Bien
Gracias RootK por recordar lo del namespace System.Web.Caching, , aunque si digo la verdad, a mi me funciona sin ponerlo
  #5 (permalink)  
Antiguo 13/01/2007, 17:10
 
Fecha de Ingreso: diciembre-2006
Mensajes: 31
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Aportación: menú en fichero XML

Hola esto es justo lo que estaba buscando pero con una diferencia en c#.

La diferencia es escasa y mi principal duda es ¿a que es equivalente cache de VB en c#?

Muchas gracias






no me voy sin pedirlo: ¿alguien lo tiene completo en c#?
  #6 (permalink)  
Antiguo 15/01/2007, 13:25
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Re: Aportación: menú en fichero XML

Cita:
Iniciado por sito-ito
¿a que es equivalente cache de VB en c#?
se maneja exactamente igual en cualquier lenguaje .Net, solo hay variaciónes de sintaxis


Cita:
Iniciado por =sito-ito
no me voy sin pedirlo: ¿alguien lo tiene completo en c#?
aqui hay una liga para traducir de vb.net a c# y viceversa

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:21.