![]() |
Aportación: menú en fichero XML Hola :-D 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 :cool: , 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 :arriba: 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 :pensando: Salu2 :adios: |
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 :cool: |
muy buena la aportacion... deberiamos hacer algo parecido en este foro, es decir que podamos aportar link y pequeños codigos utiles para todos |
Bien Gracias RootK por recordar lo del namespace System.Web.Caching, :arriba:, aunque si digo la verdad, a mi me funciona sin ponerlo :pensando: |
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#? |
Re: Aportación: menú en fichero XML Cita:
Cita:
Salu2 |
| La zona horaria es GMT -6. Ahora son las 07:51. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.