1

編集:

開発者ツールでページを確認したところ、どちらもスクリプトブロックに関数呼び出しを含むスクリプトブロックを配置しました。マスター ページを通過するスクリプト ブロックは、フォームの上部から数行離れたページの上部にスクリプト ブロックを配置します。ページから呼び出されるものは、他のスクリプト ブロックと共にフォーム要素の末尾近くに配置されます。それが誰にとっても意味があるかどうかはわかりませんが、私には関係があるように思えました。


元の質問

各ページで ScriptManager の RegisterStartupScript メソッドを複数回使用するマルチページ アプリケーションがあります。マスター ページがあるので、名前と必要に応じて別のスクリプト テキストを受け取り、そこにスタートアップ スクリプトを登録するパブリック関数を配置することにしました。これにより、スタートアップ スクリプトのより小さく、より単純な関数呼び出しと、アクセス可能な関数呼び出しを行うことができます。マスター ページを使用するすべてのページから。関数は次のとおりです。

Public Sub RunStartupScript( ByVal name As String, ByVal Optional script As String = "")
    If script = "" Then
        script = name & "();"
    End If
    ScriptManager.RegisterStartupScript(Me, [GetType](), name, script, True)
End Sub

マスター ページの aspx にもスクリプト マネージャーがあり、この関数を使用するとスクリプトが機能して実行されますが、最初のページの読み込みのみです。以降の非同期ポストバックでは、既に実行されたスクリプトは実行されません。

Master.RunStartupScript("SomePredefinedJavaScriptFunction")

この正確な関数コードを取得して、特定のページのコード ビハインドに配置すると、問題なく動作し、ポストバックで実行されます。関数がマスター ページによって所有されている場合、これが正しく機能しないのはなぜですか?

何かご意見は?

4

2 に答える 2

0

あなたは言いますI have the script manager in the aspx of the master page as well-as welそれはコンテンツページにあるということですか? MSDNごと

マスター ページ、ユーザー コントロール、およびその他の子コンポーネントでの ScriptManager コントロールの使用 ページには、その階層内に 1 つの ScriptManager コントロールのみを含めることができます。親ページに既に ScriptManager コントロールがある場合に、ネストされたページ、ユーザー コントロール、またはコンポーネントのサービスとスクリプトを登録するには、ScriptManagerProxy コントロールを使用します。詳細については、「マスター ページで ASP.NET UpdatePanel コントロールを使用する」を参照してください。

これはあなたのアプローチが機能しない理由には答えませんが、proxyコンテンツページでオブジェクトを使用することを検討することをお勧めします.

編集

コメントに基づいて、独自のプロパティを公開するのではなく、ScriptManager のGetCurrentメソッドを使用して、コンテンツ ページのスクリプト マネージャーにアクセスすることも検討する必要があります。

このようにすることで改善が得られるかどうか、私は興味があります:

    Public Sub RunStartupScript(System.Web.UI.ScriptManager sm, ByVal name As String, ByVal Optional script As String = "")
        If script = "" Then
            script = name & "();"
        End If
        sm.RegisterStartupScript(Page, Page.GetType(), name, script, True)
    End Sub

そして電話するMaster.RunStartupScript(ScriptManager.GetCurrent(...), "SomePredefinedJavaScriptFunction")

于 2016-09-27T16:40:57.797 に答える
0

したがって、これは非常に単純な間違いであることがわかりました (これらのことはよくあることですが) が、わかりにくいものです。Me はマスター ページ ファイルのページを参照するのではなく、マスター タイプを参照することを忘れていました。Me を Page に変更すると、問題が修正されました。

    Public Sub RunStartupScript( ByVal name As String, ByVal Optional script As String = "")
        If script = "" Then
            script = name & "();"
        End If
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), name, script, True)
    End Sub

他の回答とコメントをありがとう。それらを見ることで、問題を見つけるための手順を遡ってたどることができました。

于 2016-09-27T17:37:02.107 に答える