模态RadWindow在Chrome中不关闭

本文关键字:Chrome RadWindow 模态 | 更新日期: 2023-09-27 18:04:51

我有一个主"报告"页面,其中有一些用户可以采取的操作,这将打开一个模态RadWindow,让用户采取行动,然后单击保存,模态窗口将关闭,主网格刷新。

这在IE和Firefox中都工作得很好,但Chrome完成了所有的"工作",但模态页面保持打开状态。只有当我点击保存按钮时才会出现这种情况;表单顶部的取消按钮和关闭按钮仍然可以正常工作。

这是子窗口中的JavaScript:

<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 CloseRadWindow() {
        var oWnd = GetRadWindow()
        oWnd.SetUrl("");
        oWnd.close();
    }
    function CloseAndRebind(args) {
        var oWnd = GetRadWindow()
        oWnd.BrowserWindow.refreshGrid(args);
        oWnd.SetUrl("");
        oWnd.close();
    }
</script>

这是父节点的refreshgrid函数:

    <script type="text/javascript">
        function refreshGrid(arg) {
            if (!arg) {
                $find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>").ajaxRequest("Rebind");
            }
            else {
                $find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>").ajaxRequest("RebindAndNavigate");
            }
        }
    </script>

父组件通过运行:

加载模态窗口。
    protected void btnSplitInvoice_Click(object sender, EventArgs e)
    {
        var btn = sender as Button;
        var item = (GridDataItem)btn.Parent.Parent;
        long id = long.Parse(item["Id"].Text);
        var itemType = this.TabStrip1.SelectedIndex == 0 ? "TransferOrderInvoice" : "EquipmentInvoice";
        string scriptstring = "var oWindow=radopen('../Misc/SplitInvoice.aspx?id=" + id + "&type=" + itemType + "','SplitInvoice');oWindow.SetModal(true);";
        ScriptManager.RegisterStartupScript(this, this.GetType(), "openwindow", scriptstring, true);
    }

子节点的保存按钮在后面的代码中做了很多工作,然后以下面的代码结束:

ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "mykey", "CloseAndRebind('navigateToInserted');", true);

取消按钮设置如下:

<button type="button" class="CancelBtn" value="" onclick="CloseRadWindow()">
                        </button>

我发现了一个条目,从一段时间以前,建议添加window.open('', '_self', '');关闭,但这似乎不适用(也没有工作,当我测试它的heck)。

编辑:当运行Chrome与控制台打开时,我确实看到,当refreshgrid运行时,我在主页上得到一个错误:

Cannot call method 'ajaxRequest' of null

但不确定这是否是导致问题的原因。

EDIT2:所以问题似乎是,当使用Chrome时,从母版页的RadAjaxManager似乎没有发现refreshGrid运行的时间,这是上面的空错误的原因。我能够通过用document.location.reload();替换refreshGrid函数的核心来"修复"这个问题,它做得很好。如果我能帮助它,我宁愿不重新加载整个页面,但是,所以想知道是否有办法解决这个问题,仍然。我很好奇为什么IE和Firefox似乎可以处理这个问题,而Chrome却不行?

可能有用的更多信息:主页的Page_Load事件:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.Session["AllUserLocationValue"] = string.Empty;
            this.InitializeThePage();
        }
        RadAjaxManager manager = RadAjaxManager.GetCurrent(this.Page);
        manager.AjaxRequest += this.manager_AjaxRequest;
        manager.AjaxSettings.AddAjaxSetting(manager, this.pnlHeading, this.RadAjaxLoadingPanel1);
        manager.AjaxSettings.AddAjaxSetting(manager, this.RadCodeBlock1, this.RadAjaxLoadingPanel1);
    }

模态RadWindow在Chrome中不关闭

删除对SetUrl(")的调用,因为它开始处理当前页面,如果浏览器足够快,它将无法调用close()

如果你需要导航RadWindow,你可以使用以下三个选项之一

  • 设置它的ReloadOnShow属性为true。通常与ShowContentDuringLoad=false一起使用

  • 设置DestroyOnClose为true。请谨慎使用,并在close()

  • 之前添加超时
  • 使用OnClientClose事件将url设置为空白页

好的,我发现Chrome确实一直"丢失"报告页面的母版页引用,或者至少RadAjaxManager在那里,而Firefox和IE没有(我可以跟踪并观察$find工作为他们两个)。

我确实发现,然而,Chrome(和其他两个)可以始终找到报告的主网格(这是refreshGrid最终寻找的)。因此,我能够将refreshGrid的核心替换为:

function refreshGrid(arg) {
            var radgridNotApproved = $find("<%= rgNotApproved.ClientID %>").get_masterTableView();
            radgridNotApproved.rebind();
        }

得到我想要的行为。它也更干净;refreshGrid的原始版本看起来可能原本打算做的不仅仅是重新绑定网格,但当我看着它的时候,这就是它真正做的。