【问题标题】:Access parent control from iframe's codebehind从 iframe 的代码隐藏访问父控件
【发布时间】:2012-10-08 16:52:42
【问题描述】:

所以我对非 mvc 网络开发还很陌生,我遇到了 iFrame 的问题。

在我的主页中,我有一个通过 jQuery 显示和隐藏 iframe 的复选框。在我的 iFrame 代码隐藏中,我有一个方法 loadStuff(),我只想在 iFrame 可见时运行它。也就是说,我不想只将其粘贴在 page_load 中,因为如果这样做,它将在每次刷新主页时尝试运行。

所以我想我只是检查一下主窗口中的复选框是否被选中,如果是,则运行 loadStuff() 方法。

问题是,我不知道如何从 iFrame 的代码隐藏中访问该复选框。似乎this.Parent.FindControls() 的某些变体可以工作,但我没有任何运气。

这是我所拥有的一点点:

主页(我们称之为mainpage.aspx):

<input type="checkbox" id="showIFrame" onclick="if(this.Clicked) $('#iframe').show(); else $('#iframe').hide();" />

//...

<div id="iframe" style="display:none;">
<iframe runat="server" id="iframeNetSheet" .../></iframe>
</div>

因此,当单击该复选框时,会显示 iFrame。那是我想调用加载函数的时候。到目前为止,它在 iFrame 的 page_load 中,每次加载父页面时都会命中。

谁能帮我指出正确的方向?

【问题讨论】:

  • 对不起,我很困惑...当您说从 iFrame 的代码隐藏中访问复选框时,您是在说在请求 iFrame 页面时能够从服务器查看父页面上的控件?对于作为 iFrame 的一部分请求的内容,这不是您应该从父页面中的 jQuery 控制的东西吗?如果我的手杖末端有误,我深表歉意。 (编辑:我的意思是,如果您将 iFrame src 设置为“about:blank”以启动,然后仅在使 iFrame 可见时设置正确的 src
  • @freefaller 不确定您所说的“作为 iFrame 的一部分所要求的内容”是什么意思。我想我 应该 做的是仅在选中复选框时才加载 iFrame,但坦率地说,我也不知道该怎么做。我将编辑问题以使其更清楚。
  • 是的,对不起,你不会认为英语是我的第一语言!我的意思是,除非您开始通过查询字符串传递内容,或者提交以 iFrame 作为目标的表单,否则您不会(作为标准)获得有关传递到 iFrame 的父页面的任何信息。我仍然认为,当您使 iFrame 可见时,您应该只考虑设置 iFrame 的 src 属性
  • @freefaller 这就是你会这样做的方式吗?我觉得好像有一种更简单的方法可以做到这一点。顺便检查一下我的编辑
  • 重新加载页面时,您是否希望复选框处于相同状态? (即,如果选中,仍然在回发时选中,因此 iFrame 是可见的?)

标签: c# asp.net iframe code-behind


【解决方案1】:

如果您在页面上有 IFrame 并且该页面已刷新,则 iFrame 也将被刷新(每次)。所以我看不出有任何理由检查父页面复选框的值。
除了设置 iframe 的可见性(如果设置为可见且src url 为空白),还设置src 并且仅在选中复选框时才加载框架(并调用loadStuff()) .
代码看起来像这样:

<input type="checkbox" id="showIFrame" onclick="SetFrame(this.checked);" />

function SetFrame(isChecked)
{
   if(isChecked) 
   {
      $('#iframe').show(); 
      var iframeNetSheet = $('#iframeNetSheet');

      if(iframeNetSheet.attr("src") == "")
         iframeNetSheet.attr("src", "SomeUrl"); //This will invoke page_load on iframe.
   }
   else 
      $('#iframe').hide();
}

在代码中默认将框架的src url 留空。 (只能由脚本设置)

【讨论】:

  • 唯一不起作用的是它传递给函数的this.Clicked 评估为假。知道为什么吗?也许我需要在 onclick 中添加一个return true; 来保持默认行为?
  • @PhillipSchmidt 改用this.checked
  • 对不起,我就是这个意思。它即将出现未定义。
  • @PhillipSchmidt 这应该可以,但你可以试试 jQuery 版本:SetFrame($(this).is(':checked'));
  • 这就是我最终使用的。 Muchos gracias
【解决方案2】:

我建议您首先将 iFrame src 设置为“about:blank” - 然后在您单击复选框时设置正确的来源。像这样的...

<script type="javascript">
  $(document).ready(function() {
    $("#showIFrame").click(function() {
      var frame = $("#iframeNetSheet");
      if ($("#showIFrame").prop("checked")) {
        frame.show();
        if (frame.prop("src") == "about:blank") {
          frame.attr("src", "newpage.aspx");
        }
      } else {
        frame.hide();
      }
    });
  });
</script>
<input type="checkbox" id="showIFrame" />
<iframe runat="server" id="iframeNetSheet" style="display:none;"/></iframe>

Live JSFiddle Demo

(在做了所有这些之后,因为我对 jQuery 不是 100% 有信心 - 我意识到这也正是 Magnus 从一开始就说的)

编辑: 正如 Marcus 所指出的,没有必要将 src 重新设置为“about:blank”,因此相应地更新了代码(并提高了效率)。

【讨论】:

  • 当框架被隐藏时,似乎没有必要将src 设置为空白。这只意味着如果设置为可见,它需要再次加载相同的url。
  • 是的,你是完全正确的@Magnus...太努力了,打字太快了...我会相应地改变(尽管它看起来太像你的答案了自己的权利)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多