0

たとえば、gridview itemtemplate で使用できるユーザー コントロールがあります。これは、ページの読み込み時にコントロールがページ上にある場合とない場合があることを意味します。コントロールが itemtemplate 内にある場合、(updatepanels を介して) 非同期ポストバックを介してグリッドビューを表示します。

コントロール自体は JavaScript に依存しているため、スクリプトブロックを登録します。最初に使用した

Page.ClientScript.RegistrerClientScriptBlock

しかし、これは非同期ポストバック (updatepanels) では機能しないため、非同期ポストバック後にページにスクリプトを登録できる ScriptManager を使用して同じことを試しました。すごい!。

ScriptManager.RegisterClientScriptBlock

ただし、ScriptManager (私が知っていること) には、スクリプトが既にページにあるかどうかを確認する機能がないため、ポストバックごとにスクリプト ブロックの複製が生成されます。これはもちろん望ましくない動作です。

Google で実行したところ、PageRequestManager の Dispose() メソッドを呼び出すことができることがわかりました。これは、スクリプトをクリアしてから再度追加するため、機能します (これにより、未使用のスクリプト ブロックを削除済みから削除するという問題も解決します)。コントロール)。

Sys.WebForms.PageRequestManager.getInstance().Dispose()

ただし、ここに投稿して以来、もちろんマイナス面があります:)。Dispose() メソッドは、マスター ページのインスタンスも破棄します。これにより、そこで実行されているスクリプトが、非同期ポストバック (updateprogress など) の後に機能しなくなります。

では、ScriptManager またはその他のツールを使用してページにスクリプトが既に存在するかどうかを確認して、重複したスクリプトを挿入するのを防ぐ方法はありますか? また、特定のスクリプト ブロックを削除する方法はありますか (たとえば、itemtemplate のアイテムを削除する場合)。

よろしくお願いします。

4

2 に答える 2

1

次のような関数を試してください。

Public Sub AddScriptToCompositeScriptSafety(ByRef manager As ScriptManager, ByRef script As ScriptReference)

    For Each item In manager.CompositeScript.Scripts
        If (item.Path = script.Path) Then
            Return
        End If
    Next
    manager.CompositeScript.Scripts.Add(script)

End Sub
于 2012-07-12T11:47:16.360 に答える
0

登録時に同じタイプとキー属性を設定すると、SM にはこれらの 1 つだけが含まれると思います。

于 2010-05-28T10:46:42.297 に答える