如何从Iframe打开重定向页面在ASP.NET的父窗口中打开?

时间:2011-02-16 16:17:45

标签: c# asp.net iframe imagebutton response.redirect

我有一个asp.net页面,其中包含嵌入了一些数据和ImageButton的Iframe。在ImageButton上单击事件(服务器端)我有Response.Redirct:

Response.Redirect("results.aspx");

这总是在iframe中打开results.aspx。我希望results.aspx应该始终在父窗口中打开。我到目前为止尝试了以下但没有效果:

Response.Redirect("<script language='javascript'>self.parent.location='results.aspx';</script>");
Response.Redirect("javascript:parent.change_parent_url('results.aspx');");

作为Rifk的回应,我添加了ClientScriptManager。 .aspx有这个条目:

<asp:ImageButton ID="ImageButton_ok" ImageUrl="~/images/ok.gif"
        OnClick="btnVerify_Click" OnClientClick="ValidateFields()" 
        runat="server"  />

Page_Load()中的代码:

ClientScriptManager cs = Page.ClientScript;
StringBuilder myscript = new StringBuilder();
myscript.Append("<script type=\"text/javascript\"> function ValidateFields() {");
myscript.Append("self.parent.location='default.aspx';} </");
myscript.Append("script>");
cs.RegisterClientScriptBlock(this.GetType(), "ButtonClickScript", myscript.ToString());

btnVerify_Click具有主要业务逻辑。如果我的业务逻辑失败,我将如何停止OnClientClick()触发?或者,如何在成功执行服务器端代码时触发?

6 个答案:

答案 0 :(得分:8)

如果是在服务器端进行重定向的页面,Response.Redirect将仅影响iFrame中的页面。您希望在该iFrame中运行一些javascript,它将重定向父级,就像您在第二个示例中所做的那样。为了运行脚本,您不应该使用Response.Redirect(),而是应该注册客户端脚本。

请参阅以下链接,了解如何在ASP.Net 2.0中的代码中注册客户端脚本 - Using Javascript with ASP.Net 2.0

例如,您可以在事件结束时添加与此类似的内容,以处理ImageButton Click:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myUniqueKey",
                    "self.parent.location='results.aspx';", true);

答案 1 :(得分:2)

我有一个asp.net页面,其中包含嵌入了一些数据和按钮的Iframe。在按钮单击事件(服务器端)上我有Response.Redirct,但我需要关闭Iframe并加载父页面。添加下面提到的脚本解决了问题。

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myUniqueKey",                     "self.parent.location='results.aspx';", true); 

答案 2 :(得分:1)

感谢Rifk的解决方案。以下是有类似问题的人的代码:

在aspx文件中,我定义了一个新的JS函数Redirection()。 ValidateFields()函数将进行一些客户端验证。

<head runat="server">
    <title>Untitled Page</title>
    <script language="javascript" type="text/javascript">
    function ValidateFields()
    {
        alert ("Some client side validations!!");
    }

    function Redirection()
    {
        self.parent.location="http://www.google.com";
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>Content - In IFrame</h2>
        <asp:CheckBox ID="chkValid" runat="server" />
        <asp:ImageButton ID="ImageButton_FillW8Online" ImageUrl="~/images/expand.gif"
        OnClick="btnVerify_Click" OnClientClick="return ValidateFields()"
            runat="server" style="height: 11px" />

    </div>
    </form>
</body>

在后面的代码中,我有非常简单的代码,在执行一些服务器端验证后注册clientscriptblock。我要求只有在服务器端验证成功时才会发生重定向。

bool isValid = false;
protected void Page_Load(object sender, EventArgs e)
{

}

protected void btnVerify_Click(object sender, EventArgs e)
{            
    //do some validations
    isValid = chkValid.Checked;
    if (isValid)
        this.Page.ClientScript.RegisterClientScriptBlock(typeof(string), "", "Redirection()", true);
}

答案 3 :(得分:1)

你可以试试这个:

Response.Write("<script>window.open('page.aspx','_parent');</script>");

问候。

答案 4 :(得分:0)

Response.Clear();
Header.Controls.Add(new LiteralControl(@"
<script type=""text/javascript"">
top.location = ""/Logout.aspx"";
parent.location = ""/Logout.aspx"";
</script>
"));

答案 5 :(得分:0)

如果您只想使用iframe(非新标签页或窗口)直接“覆盖”当前页面,那么您就不需要代码隐藏。

即:

<asp:LinkButton ID="lnkGeneralEnq" runat="server" OnClientClick="OpenOverFrame();"><strong>click this link</strong></asp:LinkButton>

和ASPX页面中的单行Java脚本代码...

function OpenOverFrame() {
            window.open('http://mywebsite.com','_parent');
        }