Отображение изображения из db в Razor/MVC3
У меня есть таблица в db, которая имеет следующее: - CountryID, CountryName и CountryImage.
Теперь я пытаюсь отобразить изображение в индексе, и у меня есть следующее в представлении: -
<td>
@if (item.Image != null)
{
<img src="@Model.GetImage(item.Image)" alt="@item.CountryName"/>
}
а затем в ViewModel у меня: -
public FileContentResult GetImage(byte[] image)
{
if (image != null)
return new FileContentResult(image, "image/jpeg");
else
{
return null;
}
}
Однако я не вижу изображение правильно.
Что я делаю неправильно?
Заранее благодарим за помощь и время.
ОБНОВЛЕНИЕ
Ok Итак, я реализовал следующее в представлении: -
<td>
@if (item.Image != null)
{
<img src="@Url.Action("GetImage", "CountryController", new { id = item.CountryID })" alt="@item.CountryName" />
}
</td>
и в CountryController: -
public ActionResult GetImage(int id)
{
var firstOrDefault = db.Countries.Where(c => c.CountryID == id).FirstOrDefault();
if (firstOrDefault != null)
{
byte[] image = firstOrDefault.Image;
return File(image, "image/jpg");
}
else
{
return null;
}
}
но когда я пытаюсь отладить код, ActionResult GetImage не попадает
Ответы
Ответ 1
Две возможности.
Напишите вместо этого действие контроллера, которое задало идентификатор изображения:
public ActionResult GetImage(int id)
{
byte[] image = ... go and fetch the image buffer from the database given the id
return File(image, "image/jpg");
}
а затем:
<img src="@Url.Action("GetImage", "SomeController", new { id = item.Id })" alt="@item.CountryName" />
Очевидно, что теперь в вашей начальной модели вам не нужно свойство Image
. Это будет восстановлено впоследствии в результате действия контроллера, ответственного за это.
Другая возможность заключается в использовании схемы URI данных, чтобы вставлять изображения в строки base64, но это может быть не широко поддерживается всеми браузерами:
<img src="data:image/jpg;base64,@(Convert.ToBase64String(item.Image))" alt="@item.CountryName" />
В этом случае вам не нужно действие контроллера, так как изображения непосредственно встроены в вашу разметку в виде строк base64.