noM*_*d17 4 ajax asp.net-mvc jquery 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");
}
Run Code Online (Sandbox Code Playgroud)
它从数据库中获取正确的图像数据,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);
}
});
Run Code Online (Sandbox Code Playgroud)
有谁知道什么可能导致我的问题?
更新
好的,所以现在在被告知是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);
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这种方法效果不佳.那么,有没有办法将参数发送到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));
}
Run Code Online (Sandbox Code Playgroud)
我只需要将源的参数从id更改为imageId(duh).谢谢你的帮助!
问题是您首先向ImageFile控制器操作发出AJAX请求,然后,当它成功返回结果时,您创建一个引用相同路由的DOM元素,因此浏览器在尝试创建图像标记时发出另一个请求.
根据它的外观,你根本不需要那个AJAX调用.如果您只是创建带有操作路径的图像标记src,则应该可以.将success回调从AJAX请求中拉出来,然后单独使用它.
或者,如果您没有做任何特别动态的事情,您可以直接在图片src代码中使用该路线,而根本不使用Javascript.例如,如果您正在使用Razor:
<image src="@(String.Format("/Home/ImageFile?id={0}", Model.MyImage))"
height="100" width="100" />
Run Code Online (Sandbox Code Playgroud)
如果它需要是动态的并且基于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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2058 次 |
| 最近记录: |