我有一个MVC Web应用程序,我试图在页面上显示图像(来自数据库),但没有成功。按照我发现的各种例子;我有我的页面“ImageTest.aspx”和处理程序“ImageViewer.ashx”
处理程序的内容是
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System.Web;
namespace Decri.WebClient.Views.Tablet
{
public class ImageViewer : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
context.Response.WriteFile("palmtree.jpg");
}
public bool IsReusable
{
get { return false; }
}
}
}
我的“ImageTest”页面包含以下内容(尝试在使用数据库之前使基本功能正常工作)
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<h2>Image Test</h2>
<img src="ImageViewer.ashx?id=1" alt="Dynamic Image" />
</asp:Content>
页面加载了“红叉”缺失的图像图标,在调试时,代码不会停在我放置在处理程序中的“ProcessRequest”的断点处。查看HTML源代码,代码与上面相同(添加了从Site.Master中获取的HTML)。
我们基于这里的控制器,其中控制器中的条目保持简单(控制器中没有任何处理程序,我理解为正确):
public ActionResult ImageTest()
{
return View();
}
我注意到如果我在文件夹中有正常的图像并正常引用它(没有处理程序)它就不会显示;将它移动到CONTENT \ IMAGES文件夹,确实如此。试图将处理程序复制到CONTENT \ IMAGES文件夹中并且没有任何区别。
我现在处于一种损失状态,并希望得到任何有这个问题的人的指导并让它发挥作用。
答案 0 :(得分:3)
试试这个:
context.Response.WriteFile(context.Server.MapPath("~/Content/Images/palmtree.jpg"));
不调用MapPath
,处理程序将在应用程序的bin
目录中查找图像。
由于您使用的是MVC框架,因此更加一致(您不需要实现自己的处理程序):
public class HelloController : Controller
{
public ActionResult ShowImage(int id)
{
var fileName = "palmtree.jpg";
var rawFile = LoadFile(); //Assuming, LoadFile() returns byte[]
return File(rawFile, MimeMapping.GetMimeMapping(fileName), fileName);
}
}
查看:
<img src="@Url.Action("ShowImage", "Hello", new { id = 1 })" alt="Dynamic Image" />