【问题标题】:How to access an image inside an IFRAME tag from code behind?如何从后面的代码访问 IFRAME 标签内的图像?
【发布时间】:2012-09-10 15:12:27
【问题描述】:

我在此页面中有 Frm_MngAddGoodsGrp.aspx 页面有一个 iframe 标记引用页面“OpenDialog.aspx”

此页面在我的项目中,我创建它以打开对话框文件并预览给用户的图像我使用名为“ImageRequestHandler.ashx”的 httphandler 文件通过将图像控件“ImgPrv”的 src 属性更改为“ImageRequestHandler.ashx”来预览图像这工作正常用户可以在提交保存按钮之前打开文件并预览它
我还提到我使用会话将图像文件的数据存储在字节数组中并将这个字节数组保存到数据库这些都是关于用户想要将新数据插入数据库的时间。


但我的问题是用户想要查看之前存储在 db 中的数据的时间
我在 Frm_MngAddGoodsGrp.aspx 中有一个 radgrid,我希望当用户单击一行 radgrid 时,IFRAME 中的图像从 db 更改为适当的图像,

我可以从 Db 读取图像的字节数组,但我不'不知道如何将其设置为图像我也可以设置我的 httphandler 使用的会话变量,但我不知道如何在 Iframe 标记内设置图像的 imageUrl。

我也用页面中的一个简单的图像控件完成了它,但我想在 iframe 中更改图像是否可能>如果可能我该怎么做.....

在我的 aspx 文件 Frm_MngAddGoodsGrp.aspx 中

<iframe id ="OpenDialogControl" runat="server"
 src = "OpenDialog.aspx" frameborder="0"  name="Iframe1"  
 scrolling="no" height="110px" width="100px"></iframe>

在 Frm_MngAddGoodsGrp.aspx 后面的代码中

 byte[] SelectedImage;
 SelectedImage = (byte[])(ImageArray.Rows[selectedReceiptIndex][8]); //Image Array ->Grid Data table
 Session["SessionImage"] = SelectedImage;
 Random random = new Random();
 ShowImage0.ImageUrl = Page.ResolveClientUrl("~/ImageRequestHandler.ashx?randomno="+ random.Next(0,1000).ToString());

        //I have tried following codes to access ImagePrv Element in Iframe1 but i couldn't
        //var image = OpenDialogControl.FindControl("ImagePrv") as Image;


在我的 aspx 文件中打开对话框

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" >
        function getRandomNumber() {
            var randomnumber = Math.random(10000);
            return randomnumber;
        }

        function OnClientAsyncFileUploadComplete(sender, args) {
            var handlerPage = '<%= Page.ResolveClientUrl("~/ImageRequestHandler.ashx")%>';
            var queryString = '?randomno=' + getRandomNumber();
            var src = handlerPage + queryString;
            var clientId = 'ImagePrv';
            document.getElementById(clientId).setAttribute("src", src);
        }
        function showName(object) {

            document.write(object.id);
        }
    </script>

</head>
<body style= "margin-top:0px; margin-left:0px; padding-left:0px; padding-top:0px; ">
    <form id="form1" runat="server" style= "margin-top:0px; margin-left:0px; padding-left:0px; padding-top:0px; ">
    <div style= "margin-top:0px; margin-left:0px; padding-left:0px; padding-top:0px; ">
        <img alt="" src="" id ="ImagePrv" runat="server"
            style= "margin-top:0px; margin-left:0px; padding-left:0px; padding-top:0px; height: 120px; width: 110px;"/> </div>
            <br /><br /><br />
    <div style= "visibility:visible">
        <cc1:AsyncFileUpload ID="AsyncFileUpload1" runat="server" 
            onuploadedcomplete="AsyncFileUpload1_UploadedComplete" ThrobberID="tid1" 
            onclientuploadcomplete="OnClientAsyncFileUploadComplete" />
    </div>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    </form>
</body>
</html>

在打开的对话框代码后面

 public partial class OpenDialog : System.Web.UI.Page
    {

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public static readonly string STORED_IMAGE = "SessionImage";
    protected void AsyncFileUpload1_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        if (AsyncFileUpload1.PostedFile != null)
        {
            HttpPostedFile file = AsyncFileUpload1.PostedFile;

            byte[] data = ReadFile(file);
            Session[STORED_IMAGE] = data;
        }
    }
    private byte[] ReadFile(HttpPostedFile file)
    {
        byte[] data = new Byte[file.ContentLength];
        file.InputStream.Read(data, 0, file.ContentLength);
        return data;

    }

}


我有一个名为 ImageRequestHandler.ashx 的 httphandler

ImageRequestHandler.ashx 后面​​的代码

public class ImageRequestHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();

           if (context.Request.QueryString.Count != 0)
            //if (context.Request.Cookies.Count != 0)
            {
                var storedImage = context.Session[OpenDialog.STORED_IMAGE] as byte[];
                if (storedImage != null)
                {
                    Image image = GetImage(storedImage);
                    if (image != null)
                    {
                        context.Response.ContentType = "image/jpeg";
                        image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                    }
                }
            }
        }

        private Image GetImage(byte[] storedImage)
        {
            var stream = new MemoryStream(storedImage);
            return Image.FromStream(stream);
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }

我希望如果有任何使用 javascript 的解决方案,我已经尝试过 document.geteleme .... 但它不起作用!!
提前致谢

【问题讨论】:

  • 如果你能把你的描述分成单独的段落,这会更清楚。只是我的两分钱。
  • 重新加载 iFrame 不行吗?您的 iFrame 页面将重新加载并可以访问会话中的信息。
  • 你介意告诉我更多关于它的信息吗?我想访问 iframe 中的图像我知道如何显示图像但无法访问 iframe 中的图像我只想将 src 属性设置为我的 httphandler 我不知道如何比这更清楚地描述它...
  • 您的第二个代码示例:是 OpenDialog.aspx 或 Frm_MngAddGoodsGrp.aspx 背后的代码吗?
  • 这是 Frm_MngAddGoodsGrp.aspx 的代码,我编辑问题以声明更多

标签: javascript asp.net image iframe file-upload


【解决方案1】:

即使您的 iframe 嵌入在 Frm_MngAddGoodsGrp.aspx 中,您也需要将 Frm_MngAddGoodsGrp.aspx 和 OpenDialog.aspx 视为单独的页面(它们是)。您不能直接从另一个页面的代码隐藏更改显示在一个页面中的内容。

也就是说,托管 iframe 的页面可以通过多种方式与托管在 iframe 中的页面进行通信:

  1. 如果页面来自同一个应用程序,它们可以共享会话状态。您可以在父页面的会话中放置一些东西(例如图像 id)并让子页面访问它。
  2. 因为iframe的src属性可以在父页面中设置,所以可以将查询字符串中的值传递给子页面。
  3. 您可以强制 iframe 重新加载,从而强制子页面完成其生命周期。如果您在会话状态或子页面查询字符串中更改了值,则可以再次访问它们。

假设您的父页面知道新图像的 id 是什么,我会将 iFrame 的 src 属性设置为 OpenDialog.aspx?imageId=12345 并让 OpenDialog.aspx 从其查询字符串中检索值并使用它来设置 @ 987654323@ 图像控件的属性。

【讨论】:

  • 这个描述告诉我如何将一些东西(参数)传递给嵌入在 iframe 中的页面,但我使用的算法是使用会话
  • 我已经用我的表单中的一个简单图像完成了我想要的事情,但我想在 iframe 中进行图像,它的 src 设置为 OpenDialog,
  • 我的父页面知道图像的字节数组并将其发送到会话但页面中有一个按钮触发 AsyncFileUpload 的浏览按钮单击然后在客户端图像处理程序上的文件上传完成后创建图像预览在打开对话框页面内的客户端上,然后我想通过单击 radgrid 行在我的父页面上进行图像预览操作,每行都有它自己的图像,但我只想在事件选择 rad 网格的索引更改后加载图像。谢谢@Ann L. 引起您的注意
  • 好的,我想我明白你在说什么了。 (感谢您的耐心等待!)我会看看这个并在几分钟内给您一个更好的答案。
  • 我对打开对话框的页面加载进行了一些更改,对我来说效果很好,我稍后会详细告诉你谢谢你的关注,你给了我一个完美的答案。谢谢安L.
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多