我需要以这种方式在视图中显示图像
<img src = <% = Url.Action("GetImage", "Home", new { productID })%>
这是应该提供数据的动作
public FileContentResult GetImage(int ID)
{
var img = db.Images.Where(p => p.ID == ID).First();
return File(img.ImageData, img.ImageMimeType);
}
此示例来自Pro ASPNET.NET MVC(Steven Sanderson / APress)。我收到以下错误: System.Web.Mvc.Controller.File(string,string)的最佳重载方法匹配有一些无效的参数。 无法从System.Data转换。 Linq.Binary to string。
然而,intellisense告诉我有一个重载方法(byte [] filecontents,string fileType)。但是,当我写上面的代码时,我得到了错误。我错过了什么吗?
修改
感谢您的回答。我在上传图片文件时遇到了类似的问题。这是我的行动方法
public ActionResult AddImage(HttpPostedFileBase image)
{
if(image != null)
{
var img = new Image();//This Image class has been
//created by the DataContext
img.ImageMimeType = image.ImageMimeType
img.ImageData = new byte[image.ContentLength];
image.InputStream.Read(img.ImageData, 0, image.ContentLength);
}
}
我收到最后一行的错误“ image.InputStream.Read(myImage.ImageData,0,image.ContentLength); ”它说它无法转换System.Data .Linq.Binary to Byte []
我所做的是(i)创建一个名为 ImageDataClass 的新类,(ii)对该类进行上述操作,(iii)从ImageDataClass到Image进行显式转换,以及(iv)使用Linq保存到数据库。
我认为不应该那么复杂。是否有任何方法可以使用简单的扩展方法,如 ToArray ,以及其他情况???
感谢您的帮助
答案 0 :(得分:3)
File()
有一个带有字节数组的重载,但是你试图传入一种System.Data.Linq.Binary
,而不是一个字节数组。但是,Binary
上有一种方法可以转换为字节数组。
试试这个:
public FileContentResult GetImage(int ID)
{
var img = db.Images.Where(p => p.ID == ID).First();
return File(img.ImageData.ToArray(), img.ImageMimeType);
}
编译错误提到“字符串”的原因纯粹是因为它无法解决您正在尝试的过载,因此它只选择一个,在本例中为字符串,然后报告类型转换错误。
[编辑:响应OP编辑]
你应该可以尝试这样的事情:
public ActionResult AddImage(HttpPostedFileBase image)
{
if(image != null)
{
var img = new Image();//This Image class has been
//created by the DataContext
img.ImageMimeType = image.ImageMimeType
var imageData = new byte[image.ContentLength];
image.InputStream.Read(imageData, 0, image.ContentLength);
img.ImageData = new System.Data.Linq.Binary(imageData);
}
}
请记住,尽管System.Data.Linq.Binary
可能只是下面的一个字节数组,或者至少是为了表示字节数据,但它本身并不是byte[]
类型;你仍然需要转换成(与System.IO.MemoryStream
相似的情况)