Mam model z plikiem obrazu tablicy bajtów, który chcę pokazać na stronie.
Jak mogę to zrobić bez wracania do bazy danych?
Wszystkie rozwiązania, które widzę, używają ActionResult
do powrotu do bazy danych w celu pobrania obrazu, ale mam już obraz na modelu ...
c#
asp.net-mvc
razor
DK ALT
źródło
źródło
Odpowiedzi:
Coś takiego może działać ...
Jak wspomniano w komentarzach poniżej, korzystaj z powyższych, mając świadomość, że chociaż może to odpowiedzieć na twoje pytanie, może nie rozwiązać twojego problemu . W zależności od problemu może to być rozwiązanie, ale nie wykluczałbym całkowicie dwukrotnego dostępu do bazy danych.
źródło
:)
To zadziałało dla mnie
źródło
Polecam coś w tym kierunku, nawet jeśli obraz znajduje się wewnątrz twojego modelu.
Zdaję sobie sprawę, że prosisz o bezpośredni dostęp do niego bezpośrednio z widoku, a wielu innych odpowiedziało na to i powiedziało ci, co jest nie tak w tym podejściu, więc jest to tylko kolejny sposób, który załaduje obraz w sposób asynchroniczny dla ciebie i dla mnie myślę, że jest lepszym podejściem.
Przykładowy model:
Przykładowa metoda w kontrolerze:
Widok
źródło
Jednym ze sposobów jest dodanie tego do nowej klasy C # lub klasy HtmlExtensions
możesz to zrobić w dowolnym widoku
źródło
Jeśli możesz zakodować bajty base-64, możesz spróbować użyć wyniku jako źródła obrazu. W swoim modelu możesz dodać coś takiego:
Twoim zdaniem:
źródło
Jeśli obraz nie jest tak duży i istnieje duża szansa, że będziesz go często używać ponownie i jeśli nie masz ich zbyt wiele i jeśli obrazy nie są tajne (co oznacza, że nie są duże transakcję, gdyby jeden użytkownik mógł potencjalnie zobaczyć obraz innej osoby) ...
Jest tu dużo „jeśli”, więc istnieje duża szansa, że to zły pomysł:
Możesz przechowywać bajty obrazu
Cache
przez krótki czas i utworzyć tag obrazu wskazujący na metodę akcji, która z kolei odczytuje z pamięci podręcznej i wypluwa obraz. Umożliwi to przeglądarce odpowiednie buforowanie obrazu.Ma to dodatkową zaletę (a może jest to kula?) W przypadku pracy w starszych przeglądarkach, w których obrazy wbudowane nie działają w IE7 (lub IE8, jeśli są większe niż 32 kB).
źródło
To jest zmodyfikowana wersja odpowiedzi Manoj, której używam w projekcie. Właśnie zaktualizowano, aby wziąć klasę, atrybuty html i użyć TagBuilder.
Które można następnie wykorzystać w następujący sposób:
źródło
Musisz mieć bajt [] w swojej bazie danych.
Mój bajt [] znajduje się w moim obiekcie Person:
Musisz przekonwertować swój bajt [] na łańcuch. Mam więc w swoim kontrolerze:
Następnie w moim pliku .cshtml mój Model to ViewModel. Oto, co mam w:
Używam go w ten sposób w moim pliku .cshtml:
„data: rozszerzenie pliku obrazu / obrazu ; base64, {0}, ciąg Twojego obrazu ”
Chciałbym, żeby to komuś pomogło!
źródło
Jeśli chcesz zaprezentować obraz, dodaj metodę jako klasę pomocniczą lub do samego modelu i pozwól metodzie przekonwertować obraz tablicy bajtów na format obrazu, taki jak PNG lub JPG, a następnie przekonwertuj na ciąg Base64. Gdy to zrobisz, powiąż wartość base64 w swoim widoku w formacie
„data: image / [rozszerzenie typu pliku obrazu] ; base64, [tutaj znajduje się ciąg base64] ”
Powyższe jest przypisane do atrybutu
img
tagusrc
.Jedynym problemem, jaki mam z tym, jest to, że ciąg base64 jest zbyt długi. Dlatego nie polecałbym tego w przypadku wielu modeli wyświetlanych w widoku.
źródło
Stworzyłem metodę pomocniczą opartą na odpowiedzi poniżej i cieszę się, że ten pomocnik może pomóc jak największej liczbie osób.
Z modelem:
Pomocnikiem jest:
Widok otrzymuje obiekt: ICollection, więc musisz go użyć w widoku w instrukcji foreach:
źródło