【问题标题】:ASP.NET MVC 4 FileContentResult runs twiceASP.NET MVC 4 FileContentResult 运行两次
【发布时间】:2013-05-03 07:04:06
【问题描述】:

我目前正在尝试查看以 BLOB 形式存储在数据库中的图像,为此我创建了一个 FileContentResult 类型的控制器操作,如下所示:

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() 也可以正常工作,但是由于某种原因,在将图像返回到视图后它会跳回顶部并再次运行。

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

$.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)。感谢您的所有帮助!

【问题讨论】:

  • 什么触发了ajax调用?

标签: jquery ajax asp.net-mvc filecontentresult


【解决方案1】:

问题是您首先向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));

【讨论】:

  • 好的,我之前做过这个,当我不必将参数发送回 ImageFile 时效果很好。我现在尝试通过设置 img.src = "/Home/ImageFile?id=" + { "imageId": imageId }; 来获取连接到用户的所有图像。但现在 ID 不作为参数发送。有什么想法吗?
  • 您能否发布整个 sn-p 作为您问题的更新?很难说你在那里做什么。
  • 它需要是动态的,我想尽可能少地在服务器端做。最终产品旨在供公司的客户使用,如果需要,他们应该能够离线工作。我只是想找出一种方法来一次加载客户需要的所有图像,以便以后可以从缓存中加载它们。所以我的问题是:我可以在不使用 $.ajax()、$.post() 或任何会导致 FileContentResult 运行两次的类似方法的情况下向我的控制器操作发送参数吗?我错过了什么吗?
  • @noMad17 请查看我的更新 - 这是否使它更清晰?
  • 你不需要那个 AJAX。另外,如果应用程序要离线使用,我会认真考虑其他选项。
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 2012-12-07
  • 2013-04-30
  • 1970-01-01
  • 2011-03-20
  • 2018-06-02
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多