Отображение изображения массива byte[] из базы данных в шаблоне страницы сведений с использованием ASP.NET MVC

Когда я пытаюсь отобразить изображение массива byte[] внутри шаблона страницы Details, используя:

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)"/>

фото пустое

Если я храню студента. Фото в сессии:

//
// GET: /Student/Details/5

public ViewResult Details(int id)
{
    Student student = db.Students.Find(id);

    Session["photo"] = student.Photo;

    return View(student);
}

и попробуйте отобразить изображение, извлекающее значение из сеанса (закомментированные строки выше), где оно работает.

Почему я получаю нулевое значение в первом случае?

После прохождения студента на просмотр в ViewResult Details(int id), Model.Photo больше не держит это значение?

2 ответа

Решение

Почему я получаю нулевое значение в первом случае?

Вы не можете передать байтовый массив на сервер в <img> тег. <img> тег просто отправляет запрос GET на указанный ресурс. Правильный способ сделать это - использовать идентификатор:

<img src="@Url.Action("RenderPhoto", new { photoId = Model.PhotoId })" />

а потом:

public ActionResult RenderPhoto(int photoId)
{
    byte[] photo = FetchPhotoFromDb(photoId);
    return File(photo, "image/jpeg");
}

Прежде всего

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

Не будет работать, Model.Photo (предположительно, ваш байтовый массив) будет обрабатываться как объект для определения значений маршрута. Он сгенерирует маршрут с открытыми свойствами объекта Array, вероятно, в соответствии с

?IsFixedSize=true&IsReadOnly=false&Length=255

Это будет довольно бесполезный URL. Как только страница загружается в браузер, браузер запросит это изображение, вызвав метод RenderPhoto, но нет параметра с именем photo, поэтому привязка будет неудачной, и даже если там был параметр с именем photo (AFAIK), в логике нет логики. DefaultModelBinder для создания байтового массива из строки, поэтому фотография имеет значение null.

Что вам нужно сделать, это передать анонимный объект со свойством Id в Url.Action

Url.Action("RenderPhoto", new { Id = Model.PhotoId })

Это будет преобразовано в строку запроса, возможно, по следующим направлениям (но это зависит от ваших маршрутов)

/xxx/RenderPhoto/25

И тогда вам нужно получить данные для фотографии в вашем методе RenderPhoto

Мартин

Другие вопросы по тегам