Javascript 使用MVC 5向客户端发送图像并在新窗口或选项卡中打开

Javascript 使用MVC 5向客户端发送图像并在新窗口或选项卡中打开,javascript,ajax,asp.net-mvc,image,Javascript,Ajax,Asp.net Mvc,Image,这个问题很简单,但我有点困惑。在我的应用程序中,当用户单击图像的缩略图时,缩略图的ID将通过AJAX发送到此控制器操作: [HttpPost] public ActionResult GetHiResImage(string thumbnailID) { Guid id = new Guid(thumbnailID); try { using (var db = new ImagesDbContext()) { va

这个问题很简单,但我有点困惑。在我的应用程序中,当用户单击图像的缩略图时,缩略图的ID将通过AJAX发送到此控制器操作:

[HttpPost]
public ActionResult GetHiResImage(string thumbnailID)
{
    Guid id = new Guid(thumbnailID);
    try
    {
        using (var db = new ImagesDbContext())
        {
            var image = db.Images.Where(x => x.ImageID == id).Select(x => x).Single();
            return File(image.ImageData, image.ImageMimeType);
        }
    }
    catch (Exception e) { }
    return Json("An error occurred while trying to retrieve the image from the database.");
}
使用此代码,客户端似乎接收到图像,但什么也没有发生

我想返回完整大小的图像到客户端-不重定向或刷新页面-但我不知道怎么做。理想情况下,我希望图像显示在一个新窗口或选项卡中,并且我正在尝试确定将使用哪种类型的
FileResult
(例如
FileResult
FileStreamResult
,或
FileContentResult
)来执行此操作

一个更大的问题是,映像没有保存在服务器上的任何目录中,因此我不能简单地将
文件路径
返回到客户端


我尝试使用
returnfile
returnfilecontentresult
都没有用。我还认为可以将包含图像Base64String表示形式的字符串返回给客户端并在模式对话框中显示,但这并不理想,因为图像的大小可能超过模式的长度/宽度。

这对于AJAX来说是一个不好的选择。虽然从技术上讲,您可以将图像数据作为AJAX响应返回,但您必须对其进行处理:即,使用JavaScript中的文件API在页面上创建图像。最后一部分是关键,也是为什么AJAX特别不适合您想要实现的目标:您无法用该图像打开新的选项卡或窗口。您只能在当前页面上使用它

好消息是,你实际上让这件事变得比任何时候都困难得多。只需在缩略图周围创建一个标准的HTML链接,并将href设置为该操作的URL和图像的id。然后将属性
target=“\u blank”
添加到链接中,您将获得一个带有全尺寸图像的新选项卡/窗口

<a href="@Url.Action("GetHiResImage", "YourController", new { thumbnailID = yourID })" target="_blank>
    <img ... />
</a>


更改您的操作以返回具有正确mime类型的图像数据,并且您的操作已完成。

谢谢-我非常感谢您的帮助。使用此方法,我是否仍将使用
返回文件
是控制器操作?是的,此操作的所有操作本质上都是模拟对图像的请求。如果我在文件系统上请求一个像“foo.jpg”这样的实际图像,那么发生的事情是IIS读取该文件并使用“image/jpeg”mime类型将数据发送到客户端,以便客户端知道如何将其作为jpeg图像处理。您的操作将执行相同的操作:获取文件数据并将其写入响应,然后使用正确的mime类型返回该响应。