【发布时间】:2010-11-13 20:10:06
【问题描述】:
如果加载的页面在 iframe 中,我如何检测服务器端(c#、asp.net mvc)?谢谢
【问题讨论】:
标签: c# asp.net html asp.net-mvc
如果加载的页面在 iframe 中,我如何检测服务器端(c#、asp.net mvc)?谢谢
【问题讨论】:
标签: c# asp.net html asp.net-mvc
但是这是不可能的。
<iframe src="mypage?iframe=yes"></iframe>
然后检查服务器端是否查询字符串包含 iframe=yes 或者使用浏览器发送的Referer头。
【讨论】:
在表单中使用以下代码:
<asp:HiddenField ID="hfIsInIframe" runat="server" />
<script type="text/javascript">
var isInIFrame = (self != top);
$('#<%= hfIsInIframe.ClientID %>').val(isInIFrame);
</script>
然后您可以在代码隐藏中轻松检查它是否是 iFrame:
bool bIsInIFrame = (hfIsInIframe.Value == "true");
经过测试并为我工作。
编辑:请注意,您需要 jQuery 来运行我上面的代码。要在不使用 jQuery 的情况下运行它,只需使用以下代码(未经测试)来设置隐藏字段的值:
document.getElementById('<%= hfIsInIframe.ClientID %>').value = isInIFrame;
编辑 2:这仅在页面加载一次时有效。如果有人有想法来改进这一点,请告诉我。就我而言,幸运的是,我只需要回发后的值。
【讨论】:
If Not IsPostback Then Postback()。
如您在@WTP 的回答中所述,无法检查是否符合您对“安全”的要求。
【讨论】:
我认为服务器端无法做到这一点,那么为什么不在 iframe 中的页面中放置一个隐藏控件呢?当 iframe 中的 URL 加载时,您可以添加一些客户端代码来设置隐藏输入以指示您在 iframe 中。最简单的检查是在客户端的 onload 方法中,如下所示:
// Set hidden input
someHiddenInput.value = self != top
它比查询字符串更安全,但对您来说仍然可能不够安全。
我的 2 美分。
【讨论】:
老问题,但为什么不采用更简单的方法,例如
var isFramed = self !== parent
【讨论】: