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

Includes HTML, texto en base de datos o StreamReader

Estas en el tema de Includes HTML, texto en base de datos o StreamReader en el foro de ASPX (.net) en Foros del Web. Buenas. Tengo un dilema . Es una especie de sistema de noticias o documentos con un formato estándar para todos. Los textos pueden ser muy ...
  #1 (permalink)  
Antiguo 19/09/2005, 07:03
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
Includes HTML, texto en base de datos o StreamReader

Buenas. Tengo un dilema .

Es una especie de sistema de noticias o documentos con un formato estándar para todos. Los textos pueden ser muy largos y no, pero todos tienen etiquetas HTML. Tengo tres opciones para mostrarlos:

1. La que menos me convence. Con includes teniendo los textos en documentos TXT o HTML. Sería la más rápida sin duda, pero creo que no podría elegir fácilmente los textos en función de un ID, ya que el include se ejecuta antes que el código .Net.

2. Insertar el texto en la base de datos. Sería fácil de manejar y seleccionar los textos, pero quizás sature demasiado las base de datos y es un poco más lento al tener que realizar la conexión con la base de datos.

3. Tener documentos HTML con los textos y utilizar un StreamReader. Leer el documento y mostrarlo en una etiqueta. El inconveniente es que es un proceso lento pero ocuparía muy poco espacio en el servidor al tiempo que no saturaría la base de datos.

En fin, ¿qué opción es mejor?¿Existe otra manera?

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 19/09/2005, 09:21
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 22 años
Puntos: 7
Yo te sugiero la 1) pero ten los includes con el nombre del ID. Ademas, puedes incluirlo facilmente si haces un RegisterClientScriptBlock
__________________
No tengo firma ahora... :(
  #3 (permalink)  
Antiguo 19/09/2005, 13:36
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
A qué te refieres con "documentos con un formato estándar para todos"?

Si son archivos de texto plano (txt, html, etc), yo preferiría la opción 2, hasta donde sé, la mayoría de gestores de noticias y weblogs guardan este tipo de información en la base de datos, te pongo el siguiente ejm: qué pasa si yo quiero buscar un determinado texto en las noticias anteriores? vas a abrir archivo por archivo a buscar el texto en cuestión?.

Si al contrario son documentos los que piensas guardar, creo que deberías considerar algún método de indexación de los mismos (DotLucene es una buena opción)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #4 (permalink)  
Antiguo 20/09/2005, 05:41
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
Sí, efectivamente son archivos en texto plano. En principio, no pensaba en ningún tipo de buscador, por lo que la locura de ir archivo por archivo buscando no se tendría que cometer.

La verdad es que me gusta eso de RegisterClientScriptBlock, aunque no tengo ni idea de lo que es . Voy a echarle un vistazo que suena bien.

Un saludo y gracias a los dos.
__________________
¡¡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!
  #5 (permalink)  
Antiguo 20/09/2005, 07:33
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
He estado mirando lo de RegisterClientScriptBlock, y según me ha parecido entender, me sirve para escribir bloques de código javascript en la cabecera de la página. No sé muy bien cómo podría adaptar esto y modificar un include .

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!
  #6 (permalink)  
Antiguo 22/09/2005, 12:02
Avatar de lucxx  
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Yo lo haria de la siguiente forma: almacenamiento semiestático. Almacenaría los artículos en la base de datos, con el contenido en campos de tipo text (varchar solo admite 8000 caracteres, y en muchos casos necesitarias cortar el contenido del articulo). Como los campos de tipo text no son "muy eficientes", "publicaria" los artículos, es decir, tienes una página .aspx plantilla, la abres y le insertas el contenido correspondiente en los sitios correspondientes (título, resumen, contenido del artículo...) [Cuando digo que la abres, me refiero en tiempo de ejecución cuando das al boton "Publicar artículo"] (Esto en el caso de asp.net 1.1, con 2.0 en lugar de tener una plantilla crearías una pagina dinamicamente y le asignarias la master page correspondiente). Así, el tiempo de carga es muy rápido porque no necesitas acceder a la base de datos cuando alguien solicita la página, y sigues teniendo el artículo en la base de datos con la ventaja que ello conlleva. Si quisieras modificar el artículo, lo harías sobre la base de datos y lo volverías a publicar, etc.
Así es como se hace normalmente
__________________
Salu2

www.pcealcala.net
  #7 (permalink)  
Antiguo 23/09/2005, 02:49
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
Me gusta mucho esto que me cuentas. Es una gran idea, no sólo para este tema sino para otros proyectos que tengo en marcha. Tengo, eso sí, algunas preguntas:

Suponiendo que tenga una página ASPX en la que almacenar los contenidos, debería tener una para cada contenido ¿no?, de modo que si hay 50 registros en la base de datos se crearían de la 1.aspx a la 50.aspx. Aunque sea automático y no haya que hacer las páginas, si estarían ocupando espacio ¿no?

Bueno, a lo mejor no me he enterado bien, pero sí puede ser una buena solución.

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!
  #8 (permalink)  
Antiguo 23/09/2005, 04:15
Avatar de lucxx  
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Si, ocuparía espacio, pero cuanto ocupa una página (solo lo que es el html, sin controles de usuario, con un codebehind común para todas si fuera necesario, etc)? ¿10kb, 30kb? Probablemente menos que cualquier imagen, es decir, unas 80 páginas podrían ocuparte 1Mb o incluso menos, y podrías ir un poco más allá y "despublicar" (eliminar la pagina correspondiente) artículos antiguos y/o con pocas visitas, de forma que en esos casos sí se acceda a la base de datos a por el contenido en el caso de que fueran solicitadas... (De todas formas, en la base de datos también ocupan espacio, aunque menos, y normalmente tendrás menos espacio de BD que de disco...).

Ojo, esta es la mejor solución siempre que el tamaño de la BD no suponga un problema!, si en tu caso tienes poco espacio de base de datos, yo recurriría a utilizar un remix:

Utilizaría la base de datos para guardar toda la información del artículo menos el contenido (es importante lo de la base de datos porque normalmente se podrán escribir comentarios, y hacer otras operaciones que requieran una relación con los artículos), y la publicación la haría como en el caso anterior (en caso de necesitar modificar el contenido, igual que lo hemos insertado en la plantilla podemos extraerlo...). De todas formas estas operaciones más costosas las realiza el administrador/editor, no los usuarios, los usuarios simplemente acceden a una página ya creada.

En el caso de que el espacio en disco también fuera un problema, podría optimizarse al máximo almacenando el contenido de los artículos en ficheros de texto o ficheros xml, y la página "verArticulo.aspx" obtendría el contenido del fichero correspondiente (no con un include).

De todas formas estos últimos metodos ya son un poco chavacanos, si no tienes muchos problemas de espacio (y los hosting de hoy día suelen dar bastante espacio) yo usaría el primer método.
__________________
Salu2

www.pcealcala.net
  #9 (permalink)  
Antiguo 23/09/2005, 04:40
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años
Puntos: 1
Hola siento entrometerme en este debate pero es que me interesa un monton. NO entiendo bien como kieres hacer lo del primer metodo. Segun pones, tambien se leerian los articulos de la base de datos o no????
No entiendo muy bien lo de [Cuando digo que la abres, me refiero en tiempo de ejecución cuando das al boton "Publicar artículo"]

gracias
__________________
:si: El hombre es el único animal que come sin tener hambre, bebe sin tener sed y habla sin tener nada que decir. :si:
  #10 (permalink)  
Antiguo 23/09/2005, 04:58
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
El espacio en el servidor no es, de momento, un problema y no creo que los artículos a publicar sobrepasen los 50. Lo que no sé muy bien es como publicar y crear la página. Si me pudieras dar el nombre del proceso de creación de este tipo de páginas con un formato estándar para que me pueda poner a buscar información al respecto te lo agradecería.

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!
  #11 (permalink)  
Antiguo 23/09/2005, 09:40
Avatar de lucxx  
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Vamos a ver, partimos de la base de que un fichero .aspx es un fichero de texto. Supongamos que en mi web tengo una carpeta que se llama "plantillas".
Dentro de esta carpeta tengo un archivo "verArticulo.plantilla" (¿extension .plantilla? ¿Por qué no?, al fin y al cabo le puedo poner la extensión que me salga de...). El archivo .plantilla podría tener de una forma muy simplificada esta pinta:

Código HTML:
 <%@ Page Inherits="MiNamespace.Articulos.VerArticulo" assembly="elquesea" %>

<html>
  <head>
	<title></title>
	...
  </head>
  <body>
	<{aquí podría llamarse a un userControl que contiene la cabecera, por ejemplo }>
	<h2><!-- AQUI EL TÍTULO DEL ARTICULO --></h2>
	<div id="resumen">
	  <p><!-- AQUI EL RESUMEN SI LO HUBIERA --></p>
	</div>
	<div id="contenido">
	  <p><!-- AQUI EL CONTENIDO --></p>
	</div>
    <{ Aquí podría llamarse a un control que nos permita saber si el artículo tiene comentarios, por ejemplo, y mostrar un enlace a ellos si los tiene }>
	<{ Y aquí llamamos a un userControl que contiene el pie }>
  </body>
</html> 
Entonces es de suponer que habrá una zona de administración de la web (vamos, el CMS) que me permita introducir un nuevo artículo (noticia, opinión o lo que sea). Cuando el "editor" termina de introducir un nuevo artículo se encuentra con dos botones:

- Guardar sin publicar: guardaria el artículo en la base de datos pero no lo publicaria, es decir, no crearía la pagina .aspx y el artículo no sería visible a los usuarios de la web. ¿Qué utilidad tiene esto? -> Permite tener artículos para publicar en otro momento, permite que se puedan tener artículos publicados y sin publicar, pero siempre almacenados en la base de datos, etc. (suponemos que en cada artículo de la tabla articulos de la base de datos habrá un campo "publicado" de tipo bit que permita saber si un artículo está publicado o no, además de otros que indiquen si se pueden hacer comentarios, etc).

- Guardar y publicar:
guarda el artículo en la base de datos, y además, abre el archivo .plantilla correspondiente (¿como saber cual es el que corresponde a los artículos? -> puedo haberlo establecido en un archivo de configuración de la web (.config)). Pues eso, que abre el archivo (como si fuera un archivo de texto que de hecho lo es), introduce el contenido (título de la página, título del artículo, resumen si lo hubiera, el artículo en sí...) en los lugares correspondientes y lo guarda en la carpeta "artículos" de la web como "xxxxx.aspx", donde xxxxx es el nombre que nos apetezca, por ejemplo el código del articulo en la base de datos (notar que hay que tener permisos de escritura en la carpeta "articulos").

Las ventajas de todo esto, porque alguien puede decir "ya, listo, pero si tengo por ejemplo un control en la pagina que tiene que acceder a la base de datos para ver si hay comentarios, hay que acceder a la base de datos de todas maneras". La respuesta es sí, pero no es lo mismo traerse un simple escalar, o cosas pequeñas, que un artículo entero, más aún si viene de un ineficiente campo tipo texto, con lo que tanto el servidor de bases de datos como el de http van a sufrir mucha menos carga, dando lugar a que todo vaya mucho más fluido (porque en localhost todo funciona muy bien, pero cuando hablamos de sitios web reales con muchas visitas, y/o shared hosting en muchos casos, entonces vienen las sorpresas, así que mejor prevenir que curar..., es como los que se empeñan de hablar del "modelo de datos desconectado" y soltar las ventajas de los DataSet y a almacenarlos sin pudor en ¡variables de sesión!, ??!!, en aplicaciones windows estará muy bien, pero en aplicaciones web siempre es más recomendable tomar el DataReader y a correr... ).

En fin, que ya deliro, espero que haya servido de ayuda...
__________________
Salu2

www.pcealcala.net
  #12 (permalink)  
Antiguo 25/09/2005, 12:50
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
Estupendo, muy bien explicado. Lo pondré en práctica esta semana y ya te contaré.

Muchas gracias.

Por cierto, una utilidad más con este tipo de sistema. Imaginemos que en el sitio mucho usuarios pueden escribir y modificar artículos, al modo de wikipedia, pero sin embargo tienen que contar con la aprobación de los administradores. El artículo y las modificaciones se guardan en la base de datos hasta que los administradores le den el visto bueno, publicándolo entonces para que sea visible públicamente.

Ya mato dos pájaros de un tiro, porque me va a servir para un proyecto futuro un poco más ambicioso.

Gracias de nuevo.
__________________
¡¡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!
  #13 (permalink)  
Antiguo 26/09/2005, 03:44
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
Una maravilla, vamos. Pongo lo que he hecho:
En verde lo que se aplica a la base de datos y en rojo a la plantilla

Código:
'Botón Nuevo Documento
Private Sub btnNuevoDoc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevoDoc.Click

        Dim fecha As String
        If Me.txtFecha.Text <> "" Then
            fecha = "'" & Me.txtFecha.Text & "'"
        Else
            fecha = "Null"
        End If

        'Para la base de datos
        Dim strIns As String = "INSERT INTO documentos (titulo,autor,fecha,contenido,activada) VALUES" & _
            " ('" & HTMLaBD(Me.txtTitulo.Text) & "'," & _
            "'" & HTMLaBD(Me.txtAutor.Text) & "'," & _
            fecha & "," & _
            "'" & HTMLaBD(Me.txtContenido.Text) & "'," & _
            Me.chkActivada.Checked.GetHashCode & "); SELECT @@Identity"
        Dim id As Integer = DevuelveScalar(strIns)

        If Me.chkActivada.Checked Then
            'Se publica el documento con el formato de la plantilla
            Dim arcPlantilla As File
            Dim txtPlantilla As New StreamReader(Server.MapPath("..\Plantilla.aspx"), Encoding.UTF8)
            Dim texto As String
            texto = txtPlantilla.ReadToEnd
            txtPlantilla.Close()
            texto = texto.Replace("<!-- TITULO -->", HTMLaBD(Me.txtTitulo.Text))
            texto = texto.Replace("<!-- AUTOR -->", HTMLaBD(Me.txtAutor.Text))
            texto = texto.Replace("<!-- FECHA -->", HTMLaBD(Me.txtFecha.Text))
            texto = texto.Replace("<!-- CONTENIDO -->", HTMLaBD(Me.txtContenido.Text))

            Dim txtNuevo As New StreamWriter(Server.MapPath("..\" & id & ".aspx"), False, Encoding.UTF8)
            txtNuevo.Write(texto)
            txtNuevo.Flush()
            txtNuevo.Close()
        End If

        Session("id") = ""
        Response.Redirect("Documentos.aspx")

    End Sub

'Botón Actualizar Documento
    Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActualizar.Click

        Dim fecha As String
        If Me.txtFecha.Text <> "" Then
            fecha = "'" & Me.txtFecha.Text & "'"
        Else
            fecha = "Null"
        End If

        Dim strUpd As String = "UPDATE documentos SET" & _
                    " titulo = '" & HTMLaBD(Me.txtTitulo.Text) & "'" & _
                    ",autor = '" & HTMLaBD(Me.txtAutor.Text) & "'" & _
                    ",fecha = " & fecha & _
                    ",contenido = '" & HTMLaBD(Me.txtContenido.Text) & "'" & _
                    ",activada = " & Me.chkActivada.Checked.GetHashCode & _
                    " WHERE id = " & Session("id")
        Try
            EjecutaNonQuery(strUpd)

            If Me.chkActivada.Checked Then
                'Se publica el documento con el formato de la plantilla
                Dim arcPlantilla As File
                Dim txtPlantilla As New StreamReader(Server.MapPath("..\Plantilla.aspx"), Encoding.UTF8)
                Dim texto As String
                texto = txtPlantilla.ReadToEnd
                txtPlantilla.Close()
                texto = texto.Replace("<!-- TITULO -->", HTMLaBD(Me.txtTitulo.Text))
                texto = texto.Replace("<!-- AUTOR -->", HTMLaBD(Me.txtAutor.Text))
                texto = texto.Replace("<!-- FECHA -->", HTMLaBD(Me.txtFecha.Text))
                texto = texto.Replace("<!-- CONTENIDO -->", HTMLaBD(Me.txtContenido.Text))

                Dim txtNuevo As New StreamWriter(Server.MapPath("..\" & Session("id") & ".aspx"), False, Encoding.UTF8)
                txtNuevo.Write(texto)
                txtNuevo.Flush()
                txtNuevo.Close()
            End If

        Catch ex As Exception
            Response.Write(strUpd)
            Exit Sub
        End Try

        Session("id") = ""
        Response.Redirect("Documentos.aspx")

    End Sub

'Botón para confirmar el borrado de un documento
    Private Sub btnConfirmSi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConfirmSi.Click
        Dim strDel As String = "DELETE FROM documentos WHERE id = " & Session("BorraDoc")
        EjecutaNonQuery(strDel)
        Dim archivo As File
        archivo.Delete(Server.MapPath("..\" & Session("BorraDoc") & ".aspx"))
        Me.pnlConfirma.Visible = False

        Response.Redirect("Documentos.aspx")
    End Sub
Muchas 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!
  #14 (permalink)  
Antiguo 26/09/2005, 06:46
Avatar de lucxx  
Fecha de Ingreso: noviembre-2003
Ubicación: Madrid
Mensajes: 321
Antigüedad: 20 años, 5 meses
Puntos: 0
Me alegra que te haya servido, al menos como idea

Una cosa... ¿por qué utilizas UTF-8? Yo siempre utilizo Encoding.GetEncoding("iso-8859-1"), que es más adecuado para el español, UTF-8 obliga a tener todo "HTMLEncoded"
__________________
Salu2

www.pcealcala.net
  #15 (permalink)  
Antiguo 05/10/2005, 09:55
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años
Puntos: 1
MUUUY GUAPO EL POST ESTE de NOTICIAS
__________________
:si: El hombre es el único animal que come sin tener hambre, bebe sin tener sed y habla sin tener nada que decir. :si:
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 12:18.