Foros del Web » Programando para Internet » ASPX (.net) »

Insertar etiqueta de control personalizado en AJAX HTML Editor

Estas en el tema de Insertar etiqueta de control personalizado en AJAX HTML Editor en el foro de ASPX (.net) en Foros del Web. Muy buenas. Para crear los contenidos de determinadas secciones de un sitio he tratado de insertarlos en una base de datos. Almacenar el texto con ...
  #1 (permalink)  
Antiguo 11/05/2010, 08:52
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Insertar etiqueta de control personalizado en AJAX HTML Editor

Muy buenas. Para crear los contenidos de determinadas secciones de un sitio he tratado de insertarlos en una base de datos. Almacenar el texto con formato HTML no hay problema, ya que lo edito a través de un Editor HTML del Ajax Control Toolkit.

La cuestión es si quiero insertar alguno de los controles personalizados que tengo para la aplicación. Al leer la base de datos y mostrarlo, lógicamente no me va a interpretar las etiquetas del control personalizado y me lo va a enviar al cliente tal cual:
Código HTML:
Ver original
  1. <controlesPersonalizados:DescargaDocumento ID="DescargaDocumentoID"
  2.            runat="server" NavigateUrl="documento.pdf" Target="_blank">Descargar documento</controlesPersonalizados:DescargaDocumento>
Había pensado procesar previamente el texto obtenido de la base de datos y sustituir la etiqueta del control por una inserción dinámica del control personalizado. Indicar que el texto de la base de datos (código HTML) se procesa a su vez en el evento Render de otro control personalizado:
Código vb:
Ver original
  1. Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
  2.             'MyBase.Render(writer)
  3.            writer.Write(String.Format("<h1>{0}</h1>", Titulo))
  4.             writer.Write(String.Format("{0}", Contenido))
  5.             writer.Write(String.Format("<div class=""fechasSeccion"">Publicado: {0:dd/MM/yyyy}", FechaPublicacion))
  6.             If FechaActualizacion <> FechaPublicacion Then
  7.                 writer.Write(String.Format(" Última actualización: {0:dd/MM/yyyy}</div>", FechaActualizacion))
  8.             End If
  9.             writer.Write("</div>")
  10.         End Sub
Gracias y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 12/05/2010, 04:00
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Insertar etiqueta de control personalizado en AJAX HTML Editor

Bueno, la cosa se complica. He pensado la siguiente opción: buscar en la propiedad Contenido mediante expresiones regulares la etiqueta correspondiente al control personalizado, pero hacerlo mejor tipo BBCode:

Código vb:
Ver original
  1. Contenido = "Esto es el texto que contiene etiquetas HTML y BBCode para
  2. interpretar. Por ejemplo:
  3. [cpersCuadroNotas Titulo='Título del cuadro']
  4. El cuadro de notas tiene texto y a su vez otros controles personalizados
  5. <ul>
  6. <li>[cpersDescargaDocumento NavigateUrl='Documento1.pdf' Target='_parent']Documento en PDF[/cpersDescargaDocumento]</li>
  7. <li>[cpersDescargaDocumento NavigateUrl='Documento1.doc' Target='_blank']Documento en MS Word[/cpersDescargaDocumento]</li>
  8. </ul>
  9. [/cpersCuadroNotas]"
CuadroNotas y DescargaDocumento son los controles personalizados heredados de Panel e HyperLink respectivamente y el resultado debería ser algo así:
Código HTML:
Ver original
  1. Esto es el texto que contiene etiquetas HTML y BBCode para
  2. interpretar. Por ejemplo:
  3. <ControlesPersonalizados:CuadroNotas ID="CuadroNotas_1" Runat="server" Titulo="Título del cuadro">
  4. El cuadro de notas tiene texto y a su vez otros controles personalizados
  5. <ul>
  6. <li><ControlesPersonalizados:DescargaDocumento ID="DescargaDocumento_1" Runat="server" NavigateUrl="Documento1.pdf" Target="_parent">Documento en PDF</ControlesPersonalizados:DescargaDocumento></li>
  7. <li><ControlesPersonalizados:DescargaDocumento ID="DescargaDocumento_2" Runat="server" NavigateUrl="Documento1.doc" Target="_blank">Documento en MS Word</ControlesPersonalizados:DescargaDocumento></li>
  8. </ul>
  9. </ControlesPersonalizados:CuadroNotas>
La inserción dinámica es sencilla en el evento Render
Código vb:
Ver original
  1. Dim cp As New ControlesPersonalizados.DescargaDocumento
  2.             cp.NavigateUrl = "Documento1.pdf"
  3.             cp.Target = "_parent"
  4.             cp.Text = "Documento en PDF"
  5.             cp.RenderControl(writer)
lo difícil está en saber cuándo intercalarlo antes de hacer:
Código vb:
Ver original
  1. writer.Write(Contenido)
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #3 (permalink)  
Antiguo 24/05/2010, 08:00
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Insertar etiqueta de control personalizado en AJAX HTML Editor

Bueno, más o menos resuelto sólo para dos controles personalizados (descarga de documentos y nota lateral). Os lo dejo por si sirve de ayuda a alguien (y también para mejorarlo y sugerir, claro):
Código vb:
Ver original
  1. Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
  2.             writer.Write(String.Format("<h1>{0}</h1>", Titulo))
  3.             writer.Write("<!-- Iniciando proceso de contenido -->")
  4.             writer.Write(procesarContenidos(Contenido))
  5.             writer.Write("<!-- Contenido procesado -->")
  6.             writer.Write(String.Format("<div class=""fechasSeccion"">Publicado: {0:dd/MM/yyyy}", FechaPublicacion))
  7.             If FechaActualizacion <> FechaPublicacion Then
  8.                 writer.Write(String.Format(" Última actualización: {0:dd/MM/yyyy}</div>", FechaActualizacion))
  9.             End If
  10.             writer.Write("</div>")
  11.         End Sub
  12.  
  13.         Private Function procesarContenidos(ByVal texto As String) As String
  14.             Dim er As New System.Text.RegularExpressions.Regex("")
  15.             Dim strPatt As String = String.Empty
  16.             Dim match As System.Text.RegularExpressions.Match
  17.             Dim sb As StringBuilder
  18.             Dim tw As System.IO.StringWriter
  19.             Dim hw As HtmlTextWriter
  20.  
  21.             'Procesa primero todos los controles de descarga de documentos
  22.            '(HyperLink personalizado) ya que no pueden tener controles hijo
  23.            strPatt = "\[cpersDescargaDocumento NavigateUrl=""(?<NavigateUrl>[^\s]*)"" Target=""([^\s]*)"" Text=""(?<Text>[^""]*)"" /\]"
  24.             Do While er.Match(texto, strPatt).Success
  25.                 sb = New StringBuilder
  26.                 tw = New System.IO.StringWriter(sb)
  27.                 hw = New HtmlTextWriter(tw)
  28.                 match = er.Match(texto, strPatt)
  29.                 Dim dd As New ControlesPersonalizados.DescargaDocumento
  30.                 dd.NavigateUrl = match.Groups("NavigateUrl").Value
  31.                 dd.Target = match.Groups("Target").Value
  32.                 dd.Text = match.Groups("Text").Value
  33.                 dd.RenderControl(hw)
  34.                 texto = String.Format("{0}{1}{2}", _
  35.                     texto.Substring(0, match.Index), _
  36.                     sb.ToString, _
  37.                     texto.Substring(match.Index + match.Length))
  38.             Loop
  39.  
  40.             'Procesa los cuadros de notas laterales (Panel personalizado)
  41.            strPatt = "\[cpersCuadroNotas Titulo=""(?<Titulo>[^\""]*)""\](?<Contenido>.*)\[/cpersCuadroNotas\]"
  42.             Do While er.Match(texto, strPatt).Success
  43.                 sb = New StringBuilder
  44.                 tw = New System.IO.StringWriter(sb)
  45.                 hw = New HtmlTextWriter(tw)
  46.                 match = er.Match(texto, strPatt)
  47.                 Dim cn As New ControlesPersonalizados.CuadroNotas
  48.                 cn.Titulo = match.Groups("Titulo").Value
  49.                 cn.ContenidoAlternativo = match.Groups("Contenido").Value
  50.                 cn.RenderControl(hw)
  51.                 texto = String.Format("{0}{1}{2}", _
  52.                     texto.Substring(0, match.Index), _
  53.                     sb.ToString, _
  54.                     texto.Substring(match.Index + match.Length))
  55.             Loop
  56.  
  57.             Return texto
  58.         End Function
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!

Etiquetas: ajax, control, editor, html, etiquetas, personalizacion, aspx
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 18:38.