none
traer una igagen desde una base de datos codigo c# RRS feed

  • Pregunta

  • Buenos dias como puedo cargar una imagen en un menu que estoy haciendo dinamico desde sql server el icono lo tengo en la base de datos

     MenuItem menuItem = new MenuItem
                    {
                        Value = row["MenuId"].ToString(),
                        ImageUrl = row["icon"] /// aqui no se que poner para que cargue la imagen en la Bd esta en formato varbinary(MAX)
                        Text = row["Title"].ToString(),
                        NavigateUrl = row["Url"].ToString(),
                        Selected = row["Url"].ToString().EndsWith(currentPage, StringComparison.CurrentCultureIgnoreCase)
                    };

    Muchas gracia spor su ayuda


    Victor Lopez

    sábado, 30 de abril de 2016 15:08

Respuestas

  • Me temo que es bastante más complicado de lo que piensas. La propiedad ImageUrl no recibe el contenido de la imagen, sino que hay que ponerle una URL tal que, cuando se hace un GET de esa URL, el servidor devuelve los bytes de la imagen.

    Esto se consigue en tu proyecto añadiendo un Generic Handler (fichero .ashx) al que le pasas en el QueryString el MenuId, y dentro del .ashx se lee el varbinary de la base de datos, y se devuelven los bytes en el Response. Después en el ImageUrl del MenuItem pones la ruta de ese ashx, pasándole como argumento el Id de esa fila para que pueda recuperar el registro pertinente.

    Esto en principio parecería muy ineficiente debido a que para cada icono del menú se va a disparar un GET desde el navegador, y cada uno de ellos va a ocasionar una búsqueda en la base de datos. Sin embargo, después de la primera vez el navegador guardará en caché todas esas imágenes y en navegaciones sucesivas ya no se las pedirá al servidor.

    • Marcado como respuesta Victor-Lopez sábado, 30 de abril de 2016 19:03
    sábado, 30 de abril de 2016 17:54

Todas las respuestas

  • Me temo que es bastante más complicado de lo que piensas. La propiedad ImageUrl no recibe el contenido de la imagen, sino que hay que ponerle una URL tal que, cuando se hace un GET de esa URL, el servidor devuelve los bytes de la imagen.

    Esto se consigue en tu proyecto añadiendo un Generic Handler (fichero .ashx) al que le pasas en el QueryString el MenuId, y dentro del .ashx se lee el varbinary de la base de datos, y se devuelven los bytes en el Response. Después en el ImageUrl del MenuItem pones la ruta de ese ashx, pasándole como argumento el Id de esa fila para que pueda recuperar el registro pertinente.

    Esto en principio parecería muy ineficiente debido a que para cada icono del menú se va a disparar un GET desde el navegador, y cada uno de ellos va a ocasionar una búsqueda en la base de datos. Sin embargo, después de la primera vez el navegador guardará en caché todas esas imágenes y en navegaciones sucesivas ya no se las pedirá al servidor.

    • Marcado como respuesta Victor-Lopez sábado, 30 de abril de 2016 19:03
    sábado, 30 de abril de 2016 17:54
  • Buenas tardes don Alberto no sabes donde puedo ver un ejemplo es que  no entiendo muy bien la verdad soy nuevo en el tema :( 

    Victor Lopez

    sábado, 30 de abril de 2016 19:03
  • No es demasiado difícil encontrar ejemplos si buscas en la web. Por ejemplo, aquí tienes un par de ellos:

    http://aspalliance.com/1322_Displaying_Images_in_ASPNET_Using_HttpHandlers.all

    http://www.codeproject.com/Articles/33310/C-Save-and-Load-Image-from-Database

    Aunque el texto está en inglés, el código fuente se entiende bastante bien sin necesidad de leer las parrafadas que lo rodean.

    domingo, 1 de mayo de 2016 10:24