2013-05-03 76 views
4

我目前正在试图查看存储在数据库中为BLOB的图像,要做到这一点,我创建的类型FileContentResult它看起来像这样的控制器操作:ASP.NET MVC 4 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); 
    } 
}); 

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

更新

好了,现在后被告知,这是阿贾克斯的是把事情搞糟我试图参数发送到我的控制器操作是这样的:

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)。谢谢你的帮助!

+0

什么触发ajax调用? – 2013-05-03 07:06:19

回答

6

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

根据它的外观,你完全不需要这个AJAX调用。如果您只是简单地使用动作路径创建图像标签src,它应该可以工作。将您的success回调从AJAX请求中提取出来,并直接使用它。

另外,如果你没有做任何特别动态的事情,你可以直接在你的图片src标记中使用路线,而不是使用Javascript。例如,如果你使用剃刀工作:

<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)); 
+0

好吧,我之前完成了这个工作,当我不必将参数发送回ImageFile时,它运行良好。我现在试着通过设置img.src =“/ Home/ImageFile?id =”+ {“imageId”:imageId}来获取所有连接到用户的图像。但是现在ID不会作为参数发送。有任何想法吗? – noMad17 2013-05-03 07:17:07

+0

你可以发布整个片段作为你的问题的更新吗?很难说出你在那里做什么。 – 2013-05-03 07:39:10

+0

它需要动态,我想尽可能少地做服务器端。最终产品应该由公司的客户使用,如果需要,他们应该能够脱机工作。我只是试图想出一种方法来加载客户需要的所有图像,以便稍后可以从缓存中加载它们。 所以我的问题是:我可以发送一个参数给我的控制器操作,而不使用$ .ajax(),$ .post()或任何类似的方法,将导致FileContentResult运行两次?我错过了什么吗? – noMad17 2013-05-03 07:39:25