通过从服务器调用 javascript 来关闭 RadWindow

Posted

技术标签:

【中文标题】通过从服务器调用 javascript 来关闭 RadWindow【英文标题】:Closing RadWindow by invoking javascript from server 【发布时间】:2011-12-07 03:19:14 【问题描述】:

我有一个如下所示的控件:

<telerik:RadCodeBlock runat="server">
    <script type="text/javascript">
        function refresh() 
            window.$find("<%= RadAjaxManager1.ClientID %>").ajaxRequest("RebindRecommendations");
        
    </script>
</telerik:RadCodeBlock>
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" OnAjaxRequest="AjaxRequest">
    <AjaxSettings>
        <telerik:AjaxSetting AjaxControlID="RadAjaxManager1">
            <UpdatedControls>
                <telerik:AjaxUpdatedControl ControlID="NameOfGrid" />
            </UpdatedControls>
        </telerik:AjaxSetting>
    </AjaxSettings>
</telerik:RadAjaxManager>
<telerik:RadWindowManager ID="RadWindowManager1" runat="server">
    <Windows>
        <telerik:RadWindow ID="RadWindow1" runat="server" NavigateUrl="UrlOfPage" OnClientClose="refresh"></telerik:RadWindow>
    </Windows>
</telerik:RadWindowManager>

页面:

<script type="text/javascript">
    function closeWindow() 
        self.close();
        return false;
    
</script>
<!-- form fields here -->
<telerik:RadButton runat="server" ID="_cancel" Text="Cancel" OnClientClick="closeWindow"></telerik:RadButton>
<telerik:RadButton runat="server" ID="_submit" Text="Submit" OnClientClick="closeWindow" OnClick="DoSomeDataBaseStuff"></telerik:RadButton>

这按预期工作。我的 RadWindow 被删除,并且我的控件的网格在点击取消或提交按钮时刷新。问题是数据库到那时还没有完成它的工作,所以网格刷新不会显示更改。我试图将我的页面实现切换为如下所示:

页面:

<script type="text/javascript">
    function closeWindow() 
        self.close();
        return false;
    
</script>
<!-- form fields here -->
<telerik:RadButton runat="server" ID="_cancel" Text="Cancel" OnClick="CallJavaScriptToKillWindow"></telerik:RadButton>
<telerik:RadButton runat="server" ID="_submit" Text="Submit" OnClick="DoSomeDataBaseStuffAndThenCallJavaScriptToKillWindow"></telerik:RadButton>

数据库工作完成后,Code Behind 最终会调用它:

ClientScript.RegisterStartupScript(GetType(), "Key", "closeWindow();", true);

我在 closeWindow 函数中击中了断点,但它没有相同的行为(窗口实际上并没有关闭)。我尝试了各种迭代,例如:

ClientScript.RegisterStartupScript(GetType(), "Key", "$(document).ready(function() return closeWindow(););", true);

无济于事。我错过了什么?

【问题讨论】:

【参考方案1】:

我不确定我是否在改进这个答案,我只是想让它更容易理解。我有一个从主页打开的 rad 窗口。 radwindow 是在代码隐藏 (C#) 中打开的,而不是 Javascript。当我的用户单击 RadWindow 上的 Save 按钮时,它会执行一些逻辑任务,然后关闭 radwindow 本身。您只需要:

把这个代码块放在你的 RadWindow aspx 中.....

<telerik:RadCodeBlock runat="server" ID="rcb1">
<script language="javascript" 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 CloseDialog(button) 

GetRadWindow().close();
  

</script>
</telerik:RadCodeBlock>

在执行关闭前逻辑后,将此代码放在 RadWindow 的按钮单击中(执行其他逻辑的同一按钮会关闭窗口)

C# ClientScript.RegisterStartupScript(typeof(string), "", "CloseDialog();");

VB ClientScript.RegisterStartupScript(Me.GetType(), "", "CloseDialog();")

如果您想知道如何从代码隐藏中打开 radwindow,我就是这样做的:

RadWindow window1 = new RadWindow();
// Set the window properties   
window1.NavigateUrl = "winStrengthChart.aspx?EMPLOYIDNAME=" + parmString;
window1.ID = "RadWindow1";
window1.Width = 800;
window1.Height = 650;
window1.VisibleStatusbar = false;
window1.Behaviors = Telerik.Web.UI.WindowBehaviors.Close | Telerik.Web.UI.WindowBehaviors.Resize | Telerik.Web.UI.WindowBehaviors.Move;
window1.VisibleOnPageLoad = true; // Set this property to True for showing window from code   
rwm1.Windows.Add(window1);
this.Form1.Controls.Add(window1);   

...当然你需要一个基本的 RadWindowManager 在打开窗口的主页上:

<telerik:RadWindowManager ID="rwm1" runat="server">
<Windows>
</Windows>
</telerik:RadWindowManager>

如果我犯了错误,这应该可以工作,请纠正我。

谢谢

【讨论】:

【参考方案2】:

什么是“自我”?你不是说“这个”吗?

您是尝试从窗口内部还是从启动窗口的页面关闭 RadWindow?

在窗口内,我通常这样做:

    function GetRadWindow()
    
        var oWindow = null;
        if (window.radWindow)
            oWindow = window.radWindow;
        else if (window.frameElement.radWindow)
            oWindow = window.frameElement.radWindow;
        return oWindow;
    

    function Close()
    
        var oWindow = GetRadWindow();
        oWindow.argument = null;
        oWindow.close();
        return false;
    

另外,我会使用 ScriptManager.RegisterStartupScript 而不是 ClientScript。

【讨论】:

self = 据我所知,javascript 中的窗口。我试图从窗口内关闭。发布的代码成功了。可悲的是,我想我已经在 Telerik 的网站上看到过这个帖子,但认为它只适用于 Control。无论如何,感谢您的发帖!【参考方案3】:

我很确定我以前遇到过这个问题,我认为这解决了它:

setTimeout("self.close()", 1000);

如果这不起作用,试试这个:

setTimeout("self.focus()", 500); //adjust the timeout as needed
setTimeout("self.close()", 1000);

如果您愿意,也可以这样做:

setTimeout(function()
    self.close();
, 1000);

【讨论】:

感谢您的回复。我曾考虑过做某种睡眠,但这确实是最后的手段。这也意味着我还没有了解到为什么这两个实现的行为不同。

以上是关于通过从服务器调用 javascript 来关闭 RadWindow的主要内容,如果未能解决你的问题,请参考以下文章

如何通过从服务器调用 gif 来检查是不是有连接互联网连接?

PLSQL程序通过从表中获取记录来添加数字[关闭]

通过从C#中的类调用函数来显示消息

通过从数组中选择来创建排列

通过从上到下滚动表格来刷新 UITable 内容

通过从file:matplotlib读取值来绘制CDF