Я возвращаю набор данных из моей базы данных MS SQL 2008R2, которая содержит данные, которые я уже получаю от данных в режиме Razor. Я добавил поле byte [], которое содержит эскиз изображения, который я пытаюсь отобразить в этом представлении.
Поскольку массив байтов относительно крошечный, я решил, что попробую отобразить массив байтов inline. Однако после прочтения могут возникнуть некоторые проблемы, связанные с браузером, я отказался от этого.
Создание метода контроллера казалось возможным (оба метода найдены здесь), однако у меня уже есть массив байтов, готовый пойти на мой взгляд, и дон Вам нужно сделать другой вызов db, чтобы получить его на основе идентификатора.
Выполнение этого, не работает по понятным причинам:
... отображение других данных на странице....
@if (Model.dsResults.Tables[0].Rows[i]["ImageBytes"] == null)
{
<img src="@Url.Content("~/Content/Images/NoPhoto.png")" border="0" />
}
else
{
<img src="@Url.Action("GetImage", "SearchResults", new { imageBytes = Model.dsResults.Tables[0].Rows[i]["ImageBytes"] })" alt="Product Image" />
}
...
Метод контроллера:
[Authorize]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetImage(byte[] imageBytes)
{
byte[] byteArray = imageBytes;
return new FileContentResult(byteArray, "image/jpeg");
}
... поскольку это по существу пытается отправить массив байтов через http.
Итак, на мой вопрос, так как у меня уже есть массив байтов на моем представлении Razor, как его отобразить?
- Обновление -
Я понимаю, что делать обработку в представлении не рекомендуется, но поскольку данные уже существуют, не может быть сделано подобное:
Response.Write((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]);
Или...
Stream s = new MemoryStream(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]));
System.Drawing.Image img = new System.Drawing.Bitmap(s);
В других сообщениях я прочитал, что вы делаете Response.Write(byte []...)), но в этом случае это не работает.
- UPADATE -
В моем постоянном поиске эффективности (не нужно делать другой запрос в db) WebImage помощник кажется хорошим кандидат. Один из его конструкторов примет байтовый массив для инициализации класса, а затем используя метод .Write( "jpeg" ), я вижу изображение.
<td>
@{
WebImage webImage = new WebImage(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]));
webImage.Write("jpeg");
}
</td>
Проблема с использованием WebImage.Write() заключается в том, что после использования изображение является единственным, что отображается на странице. Есть ли способ сделать это прямо на "контроле" на странице просмотра Razor?
- ОБНОВЛЕНИЕ -
Это продолжает меня беспокоить... поэтому я попробовал следующее, которое, как я полагал, может работать, поскольку это то, что мы делаем из Action...
if (Model.dsResults.Tables[0].Rows[i]["ImageBytes"] != DBNull.Value)
{
var img1 = new FileContentResult(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]), "image/jpeg");
<text>
<img src="@new FileContentResult(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]), "image/jpeg")" />
</text>
}
... не работает.