【问题标题】:redirecting to page from inside iframe从 iframe 内部重定向到页面
【发布时间】:2013-09-05 12:01:30
【问题描述】:

我刚刚开始在 .NET 框架中编码,如果这个问题碰巧是微不足道的,我深表歉意。

我现在得到了什么

使用三个iframes 的简单布局的main.aspx 页面

中间的 iframe 内容需要是动态的(首先是 login.aspx 页面,然后是登录 entryform.aspx


问题 #1

在iframe内登录login.aspx后,重定向到main.aspx

我找到的解决方案

ClientScript.RegisterStartupScript(this.GetType(),"scriptid", "window.parent.location.href='main.aspx'", true);

(http://forums.asp.net/t/1273497.aspx)


问题 #2

重定向/记录后,如何将中间 iframe 内容从 login.aspx 更改为 entryform.aspx

我想到的愚蠢的解决方案

'#form' 添加到 url 并在 main.aspx 中监听 hashchange 事件。但是,任何人都可以使用 url 本身访问表单。


所以,基本上我如何找到一种安全的方法来告诉 main.aspx 页面它需要在重定向/记录后更改它的中间 iframe 内容

或者在 .NET 中可能有一个 request.setAttribute 和 getAttribute,就像在 java 中一样,我错过了并让事情变得困难?

【问题讨论】:

  • 稍后将修改布局以包含来自另一个网站的内容和来自服务器的一些其他文档,即为什么我选择 iframe 进行布局
  • 这些网站是否都驻留在同一个域中?它们都是 ASP.NET 吗?
  • 不是同一个域,它们是带有struts框架的jsp页面,有点像webservice
  • 好的,我应该可以再举一个例子:您对 ASP.NET 中身份验证的工作原理有多熟悉,FormsAuthentication 是否可以接受?我假设 ASP.NET 应用程序驱动“中间框架”?
  • @TiesonT。我对表单认证不熟悉,但是我会很开心地学习,即使你能给我参考,我也会充分研究它们,我想做这个。所以请给我指出正确的方向

标签: c# javascript asp.net .net iframe


【解决方案1】:

将参数传递给 Main.aspx 不是更容易吗?例如

ClientScript.RegisterStartupScript(this.GetType(),"scriptid", "window.parent.location.href='main.aspx?LoadEntry=true'", true);

'main.aspx' 中的客户端 JavaScript 代码将从 'location.search' 读取该参数,如果设置了 'LoadEntry=true' - 会将中间帧的 SRC 设置为“entryform.aspx”。

当然,在“entryform.aspx.cs”中,您需要检查是否确实发生了正确的登录(例如设置了一些 Session 变量),因此没有人能够简单地将 URL 手动设置为“main.aspx?LoadEntry” =true" 绕过登录。

【讨论】:

  • 是的,我按照 Tieson 的建议使用了 FormAuthentication,它也有效。但从长远来看,我会做很多重定向,而不是显示身份验证失败消息,我只是认为使用 div 代替 iframe 会很好
【解决方案2】:

在发现在我的情况下使用 iframe 并不是最好的主意后,我接受了Tieson T 的建议并查看了HttpClient 以从其他网页获取内容。在我的情况下,它将来自同一个域和其他域。

因为我有 4.0v .NET 而不是 HttpClient,所以我使用了 HttpWebRequest

代码

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (http://localhost:1706/WebSite3/test.html);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader reader = new StreamReader(response.GetResponseStream(),encode );
string html= reader.ReadToEnd();
myDiv.innerHtml(html);

参考文献

【讨论】:

  • 由于您是在服务器上完成这一切的,它似乎还有一个好处是可以让您对用户最终与之交互的内容有更高程度的控制;处理 iframe 时,您依赖客户端的浏览器以您期望的方式运行。不错的作品。不要忘记您可以接受自己的答案(这有助于暗示问题已解决,但不妨碍将来有人添加新答案)。
  • @TiesonT.,关于标记答案,您发表您的建议,我将仅将其标记为答案。我没有要求代码,但有人指出我正确的方向,你做到了,而不是我自己:)
【解决方案3】:

跨页面和域传递变量或值不会有问题,您可以使用 post 方法和跨页面发布

【讨论】: