Проблема с отображением изображения из БД с использованием asp.net MVC 2 - PullRequest
0 голосов
/ 15 марта 2010

У меня проблемы с отображением изображения из БД. Я думаю, что этот метод для сохранения изображения работает, потому что я вижу в БД, что поля varbinary имеют какое-то значение, и этот тип изображения правильный. Также размер изображения. Но когда я хочу показать изображение для продукта, я ничего не получаю. Просто пробел .. вот мой код ...

public byte[] GetImage(int productID)
    {
        Product product = products.GetByID(productID);

        byte[] imageData = product.ImageData.ToArray();

        return imageData;
    }

Этот код находится в моем контроллере. Второй код из вида:

<% if (product.ImageData != null) { %>
    <img src='/product/getimage/<%= Html.Encode(product.ID) %>' alt=""/>
    <% } %>

Я попробовал некоторые решения, найденные здесь, по переполнению стека, и все делают это так, но это работает для них. Я понятия не имею, почему изображения не отображаются. Когда я смотрю на исходный код страницы при отладке, у меня есть:

<img src='/product/getimage/18' alt=""/>

Я использую .net 4.0, MVC 2, VS 2010 ... Заранее спасибо

Ответы [ 5 ]

1 голос
/ 15 марта 2010

Я пока не очень разбираюсь в MVC - но из того, что я вижу, я думаю, что ваша функция GetImage должна быть методом действия внутри вашего контроллера, поэтому она должна будет возвращать ActionResult?

Возможно, вам также потребуется установить заголовок Content-Type в ответе.

Этот парень выглядит так, будто знает, о чем говорит ...

http://blogs.msdn.com/miah/archive/2008/11/13/extending-mvc-returning-an-image-from-a-controller-action.aspx

1 голос
/ 15 марта 2010

Я предполагаю, что у вас есть проблема с маршрутизацией. Если url /product/getimage/18 должен работать для вашего действия, вам нужен маршрут, который выглядит примерно так:

routes.MapRoute("ProductImage",
    "product/getimage/{productID}",
    new { controller = "Product", action = "GetImage", productID = "" }
);

Чтобы подтвердить это, вы должны использовать firebug и проверить вкладку «net» (или установить точку останова в вашем действии и посмотреть, будет ли она достигнута при загрузке страницы).

Я бы также рекомендовал использовать встроенные помощники для генерации ваших URL (тогда такого рода проблемы никогда не возникнут). Вместо src='/product/getimage/<%= Html.Encode(product.ID) %>' вы можете написать src='<%=Url.Action("GetImage", "Product", new { productID = product.ID })%>'

1 голос
/ 15 марта 2010

Попробуйте изменить свой метод на:

public void GetImage(int productID)
{
    Product product = products.GetByID(productID);

    Response.ContentType = "image/jpeg";
    Response.BinaryWrite(product.ImageData.ToArray());

}
0 голосов
/ 15 марта 2010

Мне нужно было зарегистрировать маршруты в моем файле global.cs, как предложил Матиас.

Также мне нужно было изменить действие в моем контроллере так:

public FileContentResult GetImage(int productID)
    {
        Product product = products.GetByID(productID);

        return File(product.ImageData.ToArray(), product.ImageMimeType);
    }    

Я хочу поблагодарить всех вас за ваши быстрые ответы ...

0 голосов
/ 15 марта 2010

У вас есть:

<img src='/product/getimage/18' alt=""/> 

Обычно я бы сказал, что тег изображения выглядит так:

<img src='/product/getimage/18.jpg' alt=""/> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...