【发布时间】:2012-01-18 11:26:40
【问题描述】:
我从我的 MS SQL 2008R2 数据库返回一个数据集,其中包含一个数据表,我已经从我的 Razor 视图中获取数据。我添加了一个 byte[] 字段,其中包含我试图在该视图上显示的图像缩略图。
由于字节数组相对较小,我想我会尝试内联显示字节数组。不过看了之后可能有一些浏览器相关的问题,我放弃了这个。
创建一个控制器方法似乎是可行的方法,(这两个方法都找到了here),但是我已经准备好字节数组,可以在我的视图中使用,并且不需要进行另一个数据库调用来获得它在身份证上。
这样做,由于显而易见的原因不起作用:
...在页面上显示其他数据....
@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[]...)) 但这在这种情况下不起作用。
-- 更新--
在我不断寻求效率的过程中(不必向数据库发出另一个请求),WebImage 助手似乎是一个不错的候选者。它的一个构造函数将接受一个字节数组来初始化类,然后使用 .Write("jpeg") 方法,我可以看到图像。
<td>
@{
WebImage webImage = new WebImage(((byte[])Model.dsResults.Tables[0].Rows[i]["ImageBytes"]));
webImage.Write("jpeg");
}
</td>
使用 WebImage.Write() 的问题在于,一旦使用,图像是唯一呈现在页面上的东西。有没有办法将它直接渲染到 Razor 视图页面上的“控件”?
-- 更新--
这一直困扰着我...所以我尝试了以下方法,我认为这可能有效,因为这是我们在 Action 中所做的...
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>
}
...不起作用。
【问题讨论】:
-
我还没有看到从模型/视图模型中获取并显示的图像示例(除了我使用 TempData 的答案)。你会认为这是一个常见的要求,但要么它很简单,没有人问,要么很困难,没有人打扰。您尝试过 TempData 解决方案吗?
-
我知道这不是我的问题,但是... 什么是反对票?这是一个很好的问题 - 太好了,以至于没有人有一个不涉及额外的数据库旅行或浏览器愚蠢的解决方案。反对者至少应该发表评论。
-
是的,说真的 - 因为我对低效的解决方案不满意? :) 不得不再次往返数据库似乎效率非常低,因为我已经准备好所有数据(图像再见和所有)都可以继续查看。我正在尝试提出一些不同的途径,并且使用 WebImage 帮助器是我得到的最接近的方法 - 它实际上显示了图像,但它是页面上唯一的内容。
-
我正在经历这个确切的痛苦。我允许用户一次上传最多 10 张图片,然后在保存后将它们显示在详细信息视图中,这让我的问题变得更糟。
标签: asp.net-mvc-3 c#-4.0 bytearray razor