使用asp.net MVC 2从DB显示图像的问题

时间:2010-03-15 15:12:37

标签: asp.net asp.net-mvc database image

我在从db显示图像时遇到问题。我认为保存图像的方法是有效的,因为我在DB中看到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 个答案:

答案 0 :(得分:1)

我的猜测是你有路由问题。如果网址/product/getimage/18适用于您的操作,则需要使用如下所示的路由:

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

要确认这一点,您应该使用firebug并检查“网络”标签(或在您的操作中设置一个断点,看看它是否在您加载页面时被点击)。

我还建议使用内置帮助程序来生成您的网址(然后这种问题永远不会发生)。您可以写src='/product/getimage/<%= Html.Encode(product.ID) %>'

而不是src='<%=Url.Action("GetImage", "Product", new { productID = product.ID })%>'

答案 1 :(得分:1)

尝试将您的方法更改为:

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

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

}

答案 2 :(得分:1)

我还不是MVC的专家 - 但是从我所看到的,我认为你的GetImage函数需要在你的控制器中成为一个Action方法,所以它需要返回一个ActionResult?

您可能还需要在响应中设置Content-Type标头。

这家伙看起来像是知道他在说什么......

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

答案 3 :(得分:0)

你有:

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

通常情况下,我会说图片标签看起来像这样:

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

答案 4 :(得分:0)

我需要在我的global.cs文件中注册路径,就像Mathias建议的那样。

此外,我需要修改控制器中的操作:

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

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

我希望你们快速回答所有人...