如何在服务器端(使用C#,ASP.NET MVC)检测加载的页面是否在 iframe 中?谢谢。
如何在服务器端(使用C#,ASP.NET MVC)检测加载的页面是否在 iframe 中?谢谢。
然而,这是不可能的。
<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:这仅适用于页面加载一次的情况。如果有人有改进的想法,请让我知道。在我的情况下,幸运的是我只需要在postback之后获取值。
If Not IsPostback Then Postback()
。 - eidylon根据您在@WTP答案评论中所述的“安全”要求,没有适合您要求的检查方法。
我认为服务器端无法做到这一点,那么为什么不在您的页面中放置一个隐藏控件,该控件将位于iframe中?当iframe中的URL加载时,您可以添加一些客户端代码来设置隐藏输入以指示您处于iframe中。最简单的检查方法是在客户端的onload方法中进行,如下所示:
// Set hidden input
someHiddenInput.value = self != top
它比查询字符串更安全,但对于您来说仍然可能不足够安全。
这是我的意见。
虽然这是一个老问题,但为什么不采用更简单的方法呢?
var isFramed = self !== parent