ASP.NET MVC 4 FileContentResult运行两次

时间:2013-05-03 07:04:07

标签: jquery ajax asp.net-mvc filecontentresult

我目前正在尝试将存储在数据库中的图像视为BLOB,为此,我创建了一个FileContentResult类型的Controller Action,如下所示:

public FileContentResult ImageFile(string imageId)
    {
        var client = new WcfTestClient();

        DataTable table = client.GetImageData(imageId);
        var image = ConvertToBytes(table);
        byte[] bytes;

        bytes = image[0].Values.ElementAt(0);

        return File(bytes, @"image/png");
    }

它从数据库中获取正确的图像数据,并且ConvertToBytes()也正常工作但由于某种原因,在将图像返回到View后,它会跳回到顶部并再次运行。

我正在使用Ajax从我的View中调用方法,如下所示:

$.ajax({
    url: "/Home/ImageFile",
    type: "GET",
    data: { "imageId": imageId },
    success: function (data) {
        var image = document.createElement('img');
        image.src = "/Home/ImageFile?id=" + imageId;
        image.width = 100;
        image.height = 100;
        div.appendChild(image);
    }
});

有谁知道什么可能导致我的问题?

更新

好的,所以现在被告知是Ajax搞砸了之后我试图向我的Controller Action发送一个参数:

var images = JSON.parse(window.localStorage.getItem("JsonImages"));
var div = document.getElementById('imgOutput');

for (var i = 0; i < images.length; i++) {
    var imageId = images[i].pi_Id;
    var imgId = JSON.parse('{"imageId":' + imageId + '}');

    var img = document.createElement('img');
    img.src = "/Home/ImageFile?id=" + imgId;
    img.width = 100;
    img.height = 100;
    div.appendChild(img);
}

遗憾的是,这种方法效果不佳。那么,有没有办法将参数发送到ImageFile()而不使它运行两次?我在这里遗漏了一些基本的东西吗?

更新2

最后我开始工作了!这就是它现在的样子:

var images = JSON.parse(window.localStorage.getItem("JsonImages"));
var div = document.getElementById('imgOutput');

var createImage = function (src) {
    var img = document.createElement('img');
    img.src = src;
    img.height = 100;
    img.width = 100;
    return img;
}

for (var i = 0; i < images.length; i++) {
    var imageId = images[i].pi_Id;
    var imageSrc = "/Home/ImageFile?imageId=" + imageId;
    div.appendChild(createImage(imageSrc));
}

我只需要将源的参数从id更改为imageId(duh)。谢谢你的帮助!

1 个答案:

答案 0 :(得分:6)

问题是您首先向ImageFile控制器操作发出AJAX请求,然后,当它成功返回结果时,您创建一个引用相同路由的DOM元素,因此浏览器会发出另一个请求它试图创建图像标签。

根据它的外观,你根本不需要那个AJAX调用。如果您只是将动作路径创建为src的图像标记,则它应该有效。将您的success回调拉出AJAX请求,然后单独使用它。

或者,如果您没有做任何特别动态的操作,您可以直接在图片src标记中使用该路线,而根本不使用Javascript。例如,如果您正在使用Razor:

<image src="@(String.Format("/Home/ImageFile?id={0}", Model.MyImage))"
    height="100" width="100" />

如果需要动态且基于Javascript,您可以放弃AJAX,因为您不需要它:

function createImage(src, width, height) {
    var img = document.createElement('img');
    img.src = src;
    img.height = height;
    img.width = width;
    return img;
}

var someId = /* Whatever your ID is */;
var imgSrc = "/Home/ImageFile?id=" + someId;
div.appendChild(createImage(imgSrc, 100, 100));