Listar fotos desde la base de datos que están guardadas en binario

publicado por: Anonymous

Ya antes había hecho una pregunta similar a la que voy a hacer, pero ahora se trata de listar varias fotos desde la base de datos (tipo binaria) asociada a una noticia x. Actualmente llamada noticia donde inserto y edito noticias, y en esa misma vista, tengo una vista parcial listo todas las noticias, pero dentro de la vista, tengo en una columna de la tabla quiero mostrar las fotos asociada a esa noticia.

Tengo entendido que cuando se trata de una foto por noticia, desde donde listo las noticias en la vista parcial, le paso el id de la noticia usando el url.action asi:

<img alt="" src='<%: Url.Action("FotoPortada", "Noticias", New With {.id = item.IdNoticia})%>' height="30" width="30" />

Y en el controller:

Function FotoPortada(ByVal id As Integer) As FileResult
    Using db As New BD_LOSCOPIHUESEntities1
        Dim name As String = "foto_portada"
        Dim contentType = "image/jpg"
        Dim portada = db.NOTICIA.Where(Function(x) x.IdNoticia = id).FirstOrDefault()
        Return File(portada.FotoPortadaNoticia, contentType, portada.NombreFotoPortadaNoticia)
    End Using
End Function

Mi modelo de datos:

introducir la descripción de la imagen aquí

Lo cual me muestra sin ningún problema (tratándose de una foto por noticia y en este caso, de una tabla). Pero cuando se trata de una listar todas las fotos binarias asociadas a una noticia x, como debería ser en el controller? Se me ocurre algo, pero no creo que sea lo más eficiente. Dentro de la vista parcial que listo toda las noticias, llamar a otra vista parcial donde hace el cruce de las tablas para listar, de esta forma:

Dim listado = (From t3 In db.FOTO From intermedia In t3.NOTICIA.Where(Function(x) x.IdNoticia = x) Select t3) 
l.listadoFotos = listado.ToList

Y dentro de esta vista parcial(donde se realiza el cruce las tablas), llamar a una función similar como la primera que mostre de FileResult, retornando un File. Pero no creo que sea lo mas eficiente haciendo llamando a tantas vistas parciales dentro de otra. ¿Existe alguna otra forma mas eficiente?

solución

Si tienes varias noticias deberias genera un tag “img” por cada una de las imagenes

Pero le tiene que llegar a la view la lista de las imagenes que tiene cada noticia, desde el action deberias devolver el fileresult segun el id de la foto
En el action ya resuelves las fotos para cada noticia

Public Function Index() As ActionResult 

   Dim noticias = db.NOTICIA.Include("FOTOS")

   Return View(noticias)
End Function

como veras inclui la lista de fotos

Nota: quizas aqui recomendaria definir un select indicando que campos enviar, ya que si lo haces de esta forma tambien enviara el byte[] de las imagenes

La idea es que en la view realizar algo como ser

<%:foreach(FOTO img in noticias.FOTOS) {
  <img alt="" src='<%: Url.Action("GetFoto", "Noticias", New With {.id = img.IdFoto})%>' 
}%>

Buscas la foto por su id, habiendo iterado las fotos asociadas en la noticia ya que la entidad que envias a la view tiene esa informacion, generando un tag “img” por cada foto

Function GetFoto(ByVal id As Integer) As FileResult
    Using db As New BD_LOSCOPIHUESEntities1
      Dim name As String = "foto_portada"
      Dim contentType = "image/jpg"
      Dim portada = db.FOTOS.Where(Function(x) x.IdFoto = id).FirstOrDefault()
      Return File(portada.FotoPortadaNoticia, contentType, portada.NombreFotoPortadaNoticia)
    End Using
End Function

saludos

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *