如何关闭服务器端的radwindow并刷新父页面

Posted

技术标签:

【中文标题】如何关闭服务器端的radwindow并刷新父页面【英文标题】:How to close the radwindow on serverside and refresh the parent page 【发布时间】:2013-03-16 10:32:23 【问题描述】:

我想关闭RadWindow 并刷新父级:如何做这个服务器端:

我有以下情况:

两页说:

parent.aspx:

<telerik:RadWindowManager ID="RadWindowManager1" runat="server" EnableViewState ="false">
</telerik:RadWindowManager>

和parent.cs

  protected void OpenNewWindow(string url, int width, int height,int mode)
        
            RadWindow newWindow = new RadWindow();
            newWindow.NavigateUrl = url;
            newWindow.VisibleOnPageLoad = true;
            newWindow.KeepInScreenBounds = true;
            if (width > 0)
            
                newWindow.Width = width;


            
            if (height > 0)
            
                newWindow.Height = height;
            
            newWindow.VisibleStatusbar = false;
            if (mode == 0)
            
                newWindow.DestroyOnClose = true;
                newWindow.InitialBehaviors = WindowBehaviors.Maximize;
            
            RadWindowManager1.Windows.Add(newWindow);
        

我在我的父页面上的某些 gridview 的 rowcommand 中调用此方法:

像这样:

OpenNewWindow("child.aspx", 0, 0,0);

现在我想在服务器端单击child 页面上某个按钮的事件来关闭 rad 窗口并刷新父窗口,该怎么做??

【问题讨论】:

【参考方案1】:

正如你所说,你想从后面的代码中关闭。所以你可以从后面的代码中渲染Page.ClientScript.RegisterClientScriptBlock(GetType(), "CloseScript", "refreshParentPage()", true);来刷新父级。

只需在子页面中添加以下代码和脚本。父页面不需要代码。

<script>         
    function getRadWindow() 
        var oWindow = null;
        if (window.radWindow)
            oWindow = window.radWindow;
        else if (window.frameElement.radWindow)
            oWindow = window.frameElement.radWindow;
        return oWindow;
    

    // Reload parent page
    function refreshParentPage() 
        getRadWindow().BrowserWindow.location.reload();
    
</script>

<asp:Button runat="server" Text="Close" ID="CloseButton" 
    OnClick="CloseButton_Click"/>

protected void CloseButton_Click(object sender, EventArgs e)

    Page.ClientScript.RegisterClientScriptBlock(GetType(), 
        "CloseScript", "refreshParentPage()", true);

更新

// Redirect page page to url
function redirectParentPage(url) 
    getRadWindow().BrowserWindow.document.location.href = url;


// Code behind
Page.ClientScript.RegisterClientScriptBlock(GetType(), 
"CloseScript", "redirectParentPage('Parent.aspx')", true);

【讨论】:

我从 Firefox 收到以下消息:To display this page, Firefox must send information that will repeat any action (such as a search or order confirmation) that was performed earlier. 您的父页面之前已发回服务器。如果是这样,您需要确保在用户打开子 RadWindow 之前未回发父页面。或者使用 更新的代码 将父页面重定向到自身而不是重新加载。【参考方案2】:

您应该使用getRadWindow().close() 方法和OnClientClose 事件。

在 Child.aspx 上:

<script type="text/javascript">

    function getRadWindow() 
        var oWindow = null;

        if (window.radWindow) 
            oWindow = window.radWindow;
        else if (window.frameElement.radWindow) 
            oWindow = window.frameElement.radWindow;

        return oWindow;
    

    function clientClose(arg)    
        getRadWindow().close(arg);
    

</script>

在 Child.cs 中:

protected void btn_Click(object sender, EventArgs e)
         
    ScriptManager.RegisterStartupScript(Page, typeof(Page), "closeScript", "clientClose('');", true);

在 Parent.cs 中创建 RadWindow 时,添加 OnClientClose 事件:newWindow.OnClientClose = "OnChildWindowClosed";

在 Parent.aspx 上:

<script type="text/javascript">

    function OnChildWindowClosed(sender, eventArgs) 
        document.location.reload(); // there may be a cleaner way to do the refresh
    

</script>

【讨论】:

我从 Firefox 收到以下消息:To display this page, Firefox must send information that will repeat any action (such as a search or order confirmation) that was performed earlier. window.location.reload() 尝试再次执行最后一次回发,您无法阻止。改用 window.location.href = window.location.href。它通常会起作用,除非您在 URL 中有哈希。 我相信这是更好的方法,因为它会触发并使用 RadWindow 控件的OnClientClose 事件。要解决重新加载问题,请使用上面@Win 答案更新中的函数redirectParentPage。使用getRadWindow().close(arg); 将参数传递给函数OnChildWindowClosed 并与window.location.href = eventArgs.get_argument(); 一起使用【参考方案3】:

强制关闭 rad 窗口的简单方法,只需将其放在更新面板中即可:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" RenderMode="Block">
  <ContentTemplate>
     <telerik:RadWindow ID="RadWindow1" runat="server">
       <ContentTemplate>

       </ContentTemplate>
    </telerik:RadWindow>
  </ContentTemplate>
</asp:UpdatePanel>

重要提示:您必须将此属性应用到更新面板:

UpdateMode="Conditional" RenderMode="Block"

然后在你要执行的按钮里面执行关闭命令:

UpdatePanel1.update()

此命令将关闭 radwindow 并且不会刷新您的网页,也不需要 javascript,我试过了。

【讨论】:

除非您了解它为什么有效,为什么它是一个坏主意以及它可能导致什么问题,否则不要这样做。先回顾这篇文章:docs.telerik.com/devtools/aspnet-ajax/controls/window/how-to/…

以上是关于如何关闭服务器端的radwindow并刷新父页面的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 如何 刷新并关闭父页面?

子窗口关闭,父窗口如何刷新

firefox下如何关闭子窗口刷新父窗口? - 技术问答

怎么点击确定按钮关闭当前窗口,并返回父页面,并且父页面刷新。

Telerik RadWindow Javascript 向 ASP.NET 返回值

Layui关闭当前页面并刷新父页面