Ich habe ein Modell mit einer Byte-Array-Bilddatei, die ich auf der Seite anzeigen möchte.
Wie kann ich das tun, ohne zur Datenbank zurückzukehren?
Alle Lösungen, die ich sehe, verwenden ein ActionResult
, um zur Datenbank zurückzukehren und das Bild abzurufen, aber ich habe das Bild bereits auf dem Modell ...
c#
asp.net-mvc
razor
DK ALT
quelle
quelle
Antworten:
So etwas könnte funktionieren ...
Wie in den Kommentaren unten erwähnt, verwenden Sie bitte die oben genannten Informationen mit dem Wissen, dass dies zwar Ihre Frage beantworten kann, Ihr Problem jedoch möglicherweise nicht löst . Abhängig von Ihrem Problem kann dies die Lösung sein, aber ich würde nicht ausschließen, zweimal auf die Datenbank zuzugreifen.
quelle
:)
Das hat bei mir funktioniert
quelle
Ich empfehle etwas in diese Richtung, auch wenn das Bild in Ihrem Modell lebt.
Mir ist klar, dass Sie nach einem direkten Weg fragen, um direkt aus der Ansicht darauf zuzugreifen, und viele andere haben darauf geantwortet und Ihnen gesagt, was an diesem Ansatz falsch ist. Dies ist also nur ein weiterer Weg, der das Bild für Sie und mich asynchron lädt denke ist ein besserer Ansatz.
Beispielmodell:
Beispielmethode im Controller:
Aussicht
quelle
Eine Möglichkeit besteht darin, dies einer neuen c # -Klasse oder HtmlExtensions-Klasse hinzuzufügen
dann können Sie dies in jeder Ansicht tun
quelle
Wenn Sie Ihre Bytes mit Base-64 codieren können, können Sie versuchen, das Ergebnis als Bildquelle zu verwenden. In Ihrem Modell können Sie Folgendes hinzufügen:
Und aus Ihrer Sicht:
quelle
Wenn das Bild nicht so groß ist und eine gute Chance besteht, werden Sie das Bild häufig wiederverwenden, wenn Sie nicht zu viele davon haben und wenn die Bilder nicht geheim sind (was bedeutet, dass es nicht groß ist) Deal, wenn ein Benutzer möglicherweise das Bild einer anderen Person sehen könnte) ...
Viele "Wenn" sind hier, also besteht eine gute Chance, dass dies eine schlechte Idee ist:
Sie können die Bildbytes
Cache
für kurze Zeit speichern und ein Bild-Tag erstellen, das auf eine Aktionsmethode verweist, die wiederum aus dem Cache liest und Ihr Bild ausspuckt. Dadurch kann der Browser das Bild entsprechend zwischenspeichern.Dies hat den zusätzlichen Vorteil (oder ist es eine Krücke?), In älteren Browsern zu arbeiten, in denen die Inline-Bilder in IE7 (oder IE8, wenn sie größer als 32 KB sind) nicht funktionieren.
quelle
Dies ist eine modifizierte Version von Manojs Antwort, die ich für ein Projekt verwende. Gerade aktualisiert, um eine Klasse, HTML-Attribute und den TagBuilder zu verwenden.
Welches kann dann wie folgt verwendet werden:
quelle
Sie müssen ein Byte [] in Ihrer Datenbank haben.
Mein Byte [] befindet sich in meinem Personenobjekt:
Sie müssen Ihr Byte [] in einen String konvertieren. Also habe ich in meinem Controller:
Als nächstes ist mein Modell in meiner CSHTML-Datei ein ViewModel. Das habe ich in:
Ich benutze es so in meiner .cshtml-Datei:
"Daten: Bild / Bilddateierweiterung ; base64, {0}, Ihre Bildzeichenfolge "
Ich wünschte, es würde jemandem helfen!
quelle
Wenn Sie das Bild präsentieren möchten, fügen Sie eine Methode als Hilfsklasse oder zum Modell selbst hinzu und lassen Sie die Methode das Byte-Array-Bild in ein Bildformat wie PNG oder JPG konvertieren und dann in eine Base64-Zeichenfolge konvertieren. Sobald Sie das haben, binden Sie den base64-Wert in Ihrer Ansicht im Format
"data: image / [Erweiterung des Bilddateityps] ; base64, [Ihre base64-Zeichenfolge wird hier angezeigt] "
Das Obige ist dem Attribut des
img
Tags zugeordnetsrc
.Das einzige Problem, das ich damit habe, ist, dass die base64-Zeichenfolge zu lang ist. Daher würde ich es nicht empfehlen, wenn mehrere Modelle in einer Ansicht angezeigt werden.
quelle
Ich habe eine Hilfsmethode erstellt, die auf der folgenden Antwort basiert, und ich bin ziemlich froh, dass dieser Helfer so vielen wie möglich helfen kann.
Mit einem Modell:
Der Helfer ist:
Die Ansicht empfängt ein: ICollection-Objekt, sodass Sie es in der Ansicht in einer foreach-Anweisung verwenden müssen:
quelle