Tengo un modelo con un archivo de imagen de matriz de bytes que quiero mostrar en la página.
¿Cómo puedo hacer eso sin volver a la base de datos?
Todas las soluciones que veo usan un ActionResult
para volver a la base de datos para recuperar la imagen, pero ya tengo la imagen en el modelo ...
c#
asp.net-mvc
razor
DK ALT
fuente
fuente
Respuestas:
Algo como esto puede funcionar ...
Como se menciona en los comentarios a continuación, utilice lo anterior armado con el conocimiento de que, aunque esto puede responder a su pregunta, es posible que no resuelva su problema . Dependiendo de su problema, esta puede ser la solución, pero no descartaría por completo acceder a la base de datos dos veces.
fuente
:)
Esto funcionó para mi
fuente
Recomiendo algo en este sentido, incluso si la imagen vive dentro de su modelo.
Me doy cuenta de que está pidiendo una forma directa de acceder a él directamente desde la vista y muchos otros han respondido eso y le han dicho qué es lo que está mal con ese enfoque, por lo que esta es solo otra forma que cargará la imagen de forma asincrónica para usted y para mí. creo que es un mejor enfoque.
Modelo de muestra:
Método de muestra en el controlador:
Ver
fuente
Una forma es agregar esto a una nueva clase c # o clase HtmlExtensions
entonces puedes hacer esto en cualquier vista
fuente
Si puede codificar sus bytes en base 64, puede intentar usar el resultado como fuente de imagen. En su modelo, puede agregar algo como:
Y en tu opinión:
fuente
Si la imagen no es tan grande, y si hay una buena posibilidad de que la reutilice con frecuencia, y si no tiene demasiadas, y si las imágenes no son secretas (lo que significa que no es grande tratar si un usuario podría ver la imagen de otra persona) ...
Hay muchos "si" aquí, por lo que es muy probable que sea una mala idea:
Puede almacenar los bytes de la imagen
Cache
durante un breve período de tiempo y hacer que una etiqueta de imagen apunte hacia un método de acción, que a su vez lee del caché y escupe su imagen. Esto permitirá que el navegador almacene la imagen en caché de manera adecuada.Esto tiene el beneficio adicional (¿o es una muleta?) De trabajar en navegadores más antiguos, donde las imágenes en línea no funcionan en IE7 (o IE8 si son mayores de 32kB).
fuente
Esta es una versión modificada de la respuesta de Manoj que uso en un proyecto. Recién actualizado para tomar una clase, atributos html y usar TagBuilder.
Que se puede utilizar entonces de la siguiente manera:
fuente
Necesita tener un byte [] en su base de datos.
Mi byte [] está en mi objeto Person:
Necesita convertir su byte [] en una cadena. Entonces, tengo en mi controlador:
A continuación, en mi archivo .cshtml, mi modelo es un ViewModel. Esto es lo que tengo en:
Lo uso así en mi archivo .cshtml:
"datos: imagen / extensión de archivo de imagen ; base64, {0}, su cadena de imagen "
¡Deseo que ayude a alguien!
fuente
Si desea presentar la imagen, agregue un método como una clase auxiliar o al modelo en sí y permita que el método convierta la imagen de la matriz de bytes a un formato de imagen como PNG o JPG y luego conviértalo a una cadena Base64. Una vez que tenga eso, vincule el valor base64 en su vista en el formato
"data: image / [extensión de tipo de archivo de imagen] ; base64, [su cadena base64 va aquí] "
Lo anterior se asigna al atributo de la
img
etiquetasrc
.El único problema que tengo con esto es que la cadena base64 es demasiado larga. Por lo tanto, no lo recomendaría para que se muestren varios modelos en una vista.
fuente
He creado un método de ayuda basado en la respuesta a continuación y estoy muy contento de que este ayudante pueda ayudar a tantos como sea posible.
Con modelo:
El ayudante es:
La vista recibe un objeto: ICollection, por lo que debe usarlo en la vista en una declaración foreach:
fuente