0

我有一个 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 文件夹中,这没有任何区别。

我现在有点不知所措,如果遇到此问题并使其正常工作,我将不胜感激。

4

1 回答 1

2

试试这个:

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" />
于 2013-12-11T20:25:01.420 回答