Wyświetlanie obrazu tablicy bajtów [] z bazy danych w szablonie strony szczegółów przy użyciu ASP.NET MVC


Kiedy próbuję wyświetlić obraz tablicy bajtów [] w szablonie strony szczegółów z:
public FileContentResult RenderPhoto(byte[] photo)
{
// var array = (byte[])Session["photo"];
// return File(array, "image/jpeg"); return File(photo, "image/jpeg");
}<img src="@Url.Action("RenderPhoto", Model.Photo)"/>

zdjęcie null.
Jeśli zapiszę ucznia Zdjęcie w sesji:
//
// GET:/Student/Details/5public ViewResult Details(int id)
{
Student student = db.Students.Find(id); Session["photo"] = student.Photo; return View(student);
}

i spróbuj wyświetlić obraz pobierający wartość z sesji (skomentowane linie powyżej), to działa.
Dlaczego w pierwszym przypadku otrzymuję wartość null?
Po przekazaniu ucznia do widoku w
ViewResult Details (int id)
,
Model.Photo
nie ma już tej wartości?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dlaczego w pierwszym przypadku otrzymuję wartość null?

Nie możesz wysłać tablicy bajtów na serwer w tagu
& < img & >
. Znacznik
& < img & >
po prostu wysyła żądanie GET do określonego zasobu. Prawidłowym sposobem na to jest użycie identyfikatora:
<img src="@Url.Action("RenderPhoto", new { photoId = Model.PhotoId })"/>

i wtedy:
public ActionResult RenderPhoto(int photoId)
{
byte[] photo = FetchPhotoFromDb(photoId);
return File(photo, "image/jpeg");
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po pierwsze
Url.Action("RenderPhoto", Model.Photo)

To nie zadziała, Model.Photo (prawdopodobnie twoja tablica bajtów) będzie traktowane jako obiekt do wyprowadzania wartości tras. Wygeneruje trasę z publicznymi właściwościami obiektu tablicy, prawdopodobnie zgodnie z
?IsFixedSize=true&IsReadOnly=false&Length=255

To byłby całkiem bezużyteczny adres URL. Po załadowaniu strony w przeglądarce przeglądarka zapyta o ten obraz, wywołując metodę RenderPhoto, ale nie ma parametru o nazwie photo, więc wiązanie się nie powiedzie, a nawet jeśli był parametr o nazwie photo (AFAIK), nie ma logiki w DefaultModelBinder, aby utworzyć tablicę bajtów z ciągu, dlatego photo ma wartość null.
Musisz tylko przekazać anonimowy obiekt z właściwością Id do Url.Action
Url.Action("RenderPhoto", new { Id = Model.PhotoId })

Zostanie to przekonwertowane na ciąg zapytania, prawdopodobnie w następującej kolejności (ale to zależy od twoich tras)
/xxx/RenderPhoto/25

Następnie musisz odzyskać dane do zdjęcia w metodzie RenderPhoto
Jaskółka oknówka

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się