1

ユーザーがモーダル 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。これが上記の null エラーの理由です。refreshGrid 関数の内臓を に置き換えることで問題を「修正」することができましたが、問題はdocument.location.reload();ありません。できればページ全体をリロードしたくないので、これを修正する方法があるかどうか疑問に思っています. Chrome が処理しないのに IE と Firefox が処理するように見えるのはなぜですか?

役に立つかもしれない詳細情報: メイン ページの 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);

    }
4

2 に答える 2

1

SetUrl("") の呼び出しを削除します。これは、現在のページの破棄を開始し、ブラウザーが十分に高速な場合、close() の呼び出しに到達しないためです。

RadWindow をナビゲートする必要がある場合は、これらの 3 つのオプションのいずれかを使用できます。

  • その ReloadOnShow プロパティを true に設定します。通常、ShowContentDuringLoad=false と一緒に

  • DestroyOnClose を true に設定します。注意して使用し、close() の前にタイムアウトを追加してください

  • OnClientClose イベントを使用して、URL を空白ページに設定します

于 2013-03-26T14:03:53.317 に答える
1

OK、Chrome ではレポート ページのマスター ページ参照が一貫して「失われる」ことがわかりました。少なくとも、RadAjaxManagerFirefox と IE ではそうではありません (追跡して、両方の $find の動作を確認できます)。

しかし、私が見つけたのは、Chrome (および他の 2 つ) が一貫してレポートのメイン グリッド (refreshGrid最終的に探していたもの) を見つけることができるということです。だから私は内臓を次のように置き換えることができましたrefreshGrid

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

探していた動作を取得します。また、よりクリーンです。の元のバージョンは、もともとrefreshGridグリッドを再バインドする以上のことを意図していたように見えますが、私がそれを見ているときには、それが実際に行っていたすべてです。

于 2013-03-27T16:42:39.057 に答える