我在从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 ...提前致谢
答案 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标头。
这家伙看起来像是知道他在说什么......
答案 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);
}
我希望你们快速回答所有人...