Отображение изображения массива 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
Мартин