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

Когда я пытаюсь отобразить изображение массива 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)"/>

photo is null.

Если я сохраню student.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 ]

11 голосов
/ 21 апреля 2011

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

Нельзя передать байтовый массив на сервер в теге <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");
}
1 голос
/ 21 апреля 2011

Прежде всего

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

Martin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...