我从我的MS sql 2008R2数据库返回一个数据集,其中包含一个数据表,我已经从我的Razor视图获取数据。我添加了一个字节[]字段,其中包含我在该视图上显示的图像缩略图。
由于字节数组相对较小,我想我会尝试显示字节数组的内联。不过阅读后可能会有一些与浏览器有关的问题,我放弃了这一点。
创建一个控制器方法似乎是要走的路,(这两个方法都找到了here),但是我已经有字节数组准备好在我的视图,而不需要再进行另一个数据库调用来获取它的ID。
做这个,不明显的原因:
@if (Model.dsResults.Tables[0].Rows[i]["ImageBytes"] == null) { <img src="@Url.Content("~/Content/Images/NoPhoto.png")" border="0" /> } else { <img src="@Url.Action("GetImage","SearchResults",new { imageBytes = Model.dsResults.Tables[0].Rows[i]["ImageBytes"] })" alt="Product Image" /> }
… …
控制器方式:
[Authorize] [AcceptVerbs(HttpVerbs.Get)] public ActionResult GetImage(byte[] imageBytes) { byte[] byteArray = imageBytes; return new FileContentResult(byteArray,"image/jpeg"); }
…因为这本质上是尝试通过http发送字节数组。
所以,我的问题是,由于我已经在我的Razor视图中有字节数组,我该如何显示?
– 更新 –
我意识到,不建议在视图中进行处理,但是由于数据已经存在,所以不能这样做:
Response.Write((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]);
要么…
Stream s = new MemoryStream(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"])); System.Drawing.Image img = new System.Drawing.Bitmap(s);
在其他帖子中,我已经看到你做了一个Response.Write(byte [] …)),但是在这种情况下这不行。
– UPADATE –
在我不断寻求效率(不需要再提出数据库)的情况下,WebImage帮手似乎是一个很好的候选人。其中一个构造函数将接受一个字节数组来初始化该类,然后使用.Write(“jpeg”)方法,我可以看到该图像。
<td> @{ WebImage webImage = new WebImage(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"])); webImage.Write("jpeg"); } </td>
使用WebImage.Write()的问题是,一旦使用,该图像是在页面上呈现的唯一的东西。有没有办法将其直接渲染到剃须刀视图页面上的“控件”?
– 更新 –
这继续bug我…所以我尝试了以下,我认为可能会工作,因为这是我们正在做的行动…
if (Model.dsResults.Tables[0].Rows[i]["ImageBytes"] != DBNull.Value) { var img1 = new FileContentResult(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]),"image/jpeg"); <text> <img src="@new FileContentResult(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]),"image/jpeg")" /> </text> }
…不行
解决方法
Model.Content是一个byte []图像。
@{ string imageBase64 = Convert.ToBase64String(Model.Content); string imageSrc = string.Format("data:image/gif;base64,{0}",imageBase64); }
这样使用
<img src="@imageSrc" alt="@Model.Name" width="100" height="100" />