我正在研究Steven Sanderson的书(Pro ASP.NET MVC 3)。我在。我已经复制了每个单词中的单词,但它不起作用。
这是行动方法
public ActionResult Edit(Product product, HttpPostedFileBase image)
{
if(ModelState.IsValid)
{
if(image != null)
{
product.ImageMimeType = image.ContentType;
product.ImageData = new byte[image.ContentLength];
image.InputStream.Read(product.ImageData, 0, image.ContentLength);
}
//...Save product in the database using Entity Framework
}
}
这是如何在剃须刀页面上显示图像
<img width="150" height="150"
src = "@Url.Action("GetImage", "Home", new { Model.ProductID })" />
最后,GetImage
public FileContentResult GetImage(int productID)
{
Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productID);
if (prod != null)
{
return File(prod.ImageData, prod.ImageMimeType);
}
else
{
return null;
}
}
修改
我从开始到结束都遵循了整个过程(在调试过程中),这就是我能说的:
按下视图上的“保存”按钮后, HttpPostedFileBase 对象不为空。
调用db.SaveChanges()方法后,在数据库表中添加了一行。
当我调用GetImage时,它不会返回null。
但在视图中,没有显示图像
感谢您的帮助
答案 0 :(得分:2)
File
应为FileContentResult
,因为它是字节而不是磁盘上的实际文件。 img
应为prod
,对吗?
public FileContentResult GetImage(int productID)
{
Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productID);
if (prod != null)
{
return new FileContentResult(prod.ImageData, prod.ImageMimeType);
}
else
{
return null;
}
}
答案 1 :(得分:1)
像这样修改你的行动方法:
<img width="150" height="150" src = "@Url.Action("GetImage", "Home", new { @id = Model.ProductID })" />
除了那个小差异(添加id
参数)之外,你的代码与我的代码非常相似,我的图片加载得很好。顺便说一句,如果您查看页面的HTML源代码,您会看到:
/GetImage/<some number here>
或
/GetImage/
作为src
属性的值?如果是后者,这绝对应该解决问题。如果是前者,您可能需要启用GET
次请求。
答案 2 :(得分:0)
以下是让Steven Sanderson示例工作的答案,改变你的保存程序:
if (image != null)
{
var product = new Product();
product.FileName = image.FileName; //<- optional filename
product.ImageMimeType = image.ContentType;
int length = image.ContentLength;
byte[] buffer = new byte[length];
image.InputStream.Read(buffer, 0, length);
product.ImageData = buffer;
//Save product to database
}
答案 3 :(得分:0)
我也有同样的问题。 只需将控制器中Edit方法的一部分更改为这样:
if (image != null)
{
mvcImages img = db.mvcImages.Where(p => p.p_id == prod.p_id).FirstOrDefault();
prod.p_imageMimeType = image.ContentType;
byte[] buffer = new byte[image.ContentLength];
image.InputStream.Read(buffer, 0, image.ContentLength);
prod.p_imageData = buffer;
img.p_imageMimeType = prod.p_imageMimeType;
img.p_imageData = prod.p_imageData;
db.SaveChanges();
}
工作正常。 还要记住在与“if”命令相同的括号内保存更改。
答案 4 :(得分:0)
更简单的解决方法是更改产品类中的以下行:
从:改变:
public byte ImageData {get;set;}
要:
public byte[] ImageData{get;set;}
答案 5 :(得分:0)
我遇到同样的问题..试试这个:
public ActionResult Edit(Product product, HttpPostedFileBase image)
{
if(ModelState.IsValid)
{
if(image != null)
{
product.ImageMimeType = image.ContentType;
product.ImageData = new byte[image.ContentLength];
iname.InputStream.Position = 0; // This is what makes the difference
image.InputStream.Read(product.ImageData, 0, image.ContentLength);
}
//...Save product in the database using Entity Framework
}
答案 6 :(得分:0)
问题在于Action方法.. 它应该是 你必须更改控制器的名称...“GetImage”功能在“管理”控制器..其余的代码是好的...
答案 7 :(得分:0)
简单打开entity文件夹中的Products.cs文件并更改
public byte ImageData {get;set;}
要:
public byte[] ImageData{get;set;}