我们的数据库中有一些图像,想要在视图中显示它们。我找到双向来执行此操作 - 第一个:我们在控制器中创建操作方法,从数据库获取图像并返回FileContentResult:
public ActionResult GetImage( int id )
{
var imageData = ...get bytes from database...
return File( imageData, "image/jpg" );
}
视图中的代码:
<img src='<%= Url.Action( "GetImage", "image", new { id = ViewData["imageID"] } ) %>' />
第二种方式是使用HttpHandler:
public void ProcessRequest(HttpContext Context)
{
byte [] b = your image...;
Context.Response.ContentType = "image/jpeg";
Context.Response.BinaryWrite(b);
}
和视图中的代码:
<img src="AlbumArt.ashx?imageId=1" />
第一个问题是实现此功能的最有效(工作更快)的方式是什么(以及为什么它更快地工作)?
第二个问题 - 当我们第一次调用action方法返回此视图时,有一种方法可以直接将图像放入我们的视图中吗?我的意思是在动作方法中我们从数据库中获取图像列表并将它们作为列表传递给视图,并在视图中使用此代码:
<%=Html.Image(Model[i])%>
该代码必须直接从模型中将图像放入视图中。
答案 0 :(得分:6)
两种方法的性能差别不大。显然使用http处理程序将是你可以获得的最快,因为请求不会通过MVC生命周期(路由,实例化控制器,模型绑定,调用操作)但我认为这是一个微优化,我个人会使用第一种方法,因为它在MVC场景中更适应。如果您稍后通过执行大量负载测试意识到这是应用程序的瓶颈,您可以随时切换到http处理程序方法。
至于你的第二个问题是关心帮助者,答案是否定的,你不能轻易做到这一点。唯一的可能是使用data URI scheme,但并非所有浏览器都支持此功能。这样,如果您的模型具有图像的字节数组,您可以编写一个帮助程序,该帮助程序呈现以下内容:
<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAA..." alt="Red dot" />
图像数据直接编码到页面中。另一个缺点是,这些图像永远不会被缓存,并且您的HTML页面可能变得非常大。