Modal RadWindow未在Chrome中关闭

时间:2013-03-20 18:49:24

标签: c# javascript asp.net telerik

我有一个主“报告”页面,其中包含用户可以采取的一些操作,这些操作将打开模式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', '');,但这似乎不适用(当我测试它时它也不起作用)。

编辑:在控制台打开的情况下运行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);

    }

2 个答案:

答案 0 :(得分:1)

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

如果你需要远离RadWindow,你可以使用这三个选项中的一个

  • 将其ReloadOnShow属性设置为true。通常与ShowContentDuringLoad = false

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

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

答案 1 :(得分:1)

好的,我发现Chrome确实“丢失”了报告页面的母版页引用,或者至少RadAjaxManager,而Firefox和IE则没有(我可以追踪并查看$ find for the two它们)。

然而,我所发现的是,Chrome(以及其他两个)可以始终如一地找到报告的主网格(这是refreshGrid最终要查找的内容)。所以我能够将refreshGrid的内容替换为:

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

并获得我正在寻找的行为。它也更干净; refreshGrid的原始版本看起来原本打算做的不仅仅是重新绑定网格,但是当我看到它时,这就是它真正做的一切。