-1

次のvb.netロードイベントを含む次の簡単なテストasp.netフォームがあります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim strScript As String

    strScript = "function MyMsg()"
    strScript += "{"
    strScript += "alert(document.getElementById('TextBox3').value);"
    strScript += "}"
    ClientScript.RegisterStartupScript(Me.GetType(), "MyMsg", strScript, True)

End Sub

スクリプトが呼び出されたときに、Webページにテキストボックスのコンテキストを表示するだけです。

次に、このボタンコードがあります。

Protected Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click


    If ClientScript.IsStartupScriptRegistered("MyCall") Then
        Me.TextBox3.Text = "My text - registered"
    Else
        Me.TextBox3.Text = "my text NOT registered"
    End If

    ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "MyMsg();", True)

End Sub

ただし、ボタンをクリックすると、常に未登録のテキストが表示されます。したがって、コードは正常に実行されているようです。テキストボックスからテキストを取得します。問題はありません。ただし、コードの真の部分は実行されません。

これは状態またはスコープの問題ですか?(またはコードが1回だけ注入されるという事実)これがコードブロックを真に実行することを妨げますか?

上記のコードの「真の」部分を実行するにはどうすればよいですか?

4

2 に答える 2

0

ここで元の質問に対するコメントを統合(および詳細化)します。

問題は、ASP.NETボタンをクリックするたびにサーバーに完全なポストバックが発生し、ページが完全なポストバックを実行すると、前のアクションから登録された可能性のあるすべてのスクリプトがリセットされることです。これは、ボタンが最後にクリックされたときに登録されたスクリプトがすべて消去され、ページが2回目にそれについて何も知らないことを意味します。

これを回避する方法はいくつかあります。

  1. UpdatePanel:私の好みの方法は、次のようなAJAX更新パネル内のボタンクリックハンドラーで操作する必要があるすべてのコントロールを宣言することです。

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </ContentTemplate>
    </asp:UpdatePanel>
    

    これにより、ボタンがクリックされたときにボタンが変更できる内容が制限され、ポストバックが発生します。これを使用するには、updatepanelの前の任意の場所でScriptmanagerを宣言する必要もあります。RegisterScriptControlスクリプトを登録するときは、そのscriptmanagers関数を使用する必要があります。

  2. 手動AJAXポストバック:これを実現する別の方法は、「手動」AJAX呼び出しを使用することです。私はこれを数回行いましたが、更新パネルのバージョンよりもはるかに複雑であり、私が行った方法がそれを実行するための「正しい」方法であるかどうかはわかりません。まず、ASPボタンを通常のHTML入力ボタンに変更します。HTMLボタンでは、onclick指定したjavasciprt関数である必要があります。javascript関数内で、XMLHttpRequstオブジェクトを宣言するプロセスを実行する必要があります。このサイトでは、オブジェクトの使用方法について詳しく説明しています。私が情報をやり取りする方法は、要求/応答に添付されたヘッダーを使用することです。setRequestHeader関数を使用してそれらを追加し、からそれらを取得する必要がありますgetAllResponseHeaders働き。サーバー側でページ読み込みイベントに入ると、リクエストのヘッダーを評価する必要があります。ボタンがクリックされたことを示すヘッダーが存在する場合は(手動で追加する必要があります)、関数を呼び出して追加できますポップアップボックスに何を表示するかをJavaScriptに指示する応答へのヘッダー。ヘッダーを使用することは、情報をやり取りするための最良の方法ではないと確信していますが、ユーザーに何を印刷するかを指示するだけのブール値について話している場合は、おそらく設定プロセスを実行する必要はありません。 JSONまたはXML応答。これは、ボタンがクリックされた回数をチェックするだけでなく、サーバー側でより多くのことを行っていることも前提としています。それがすべての場合は、オプション3を使用する必要があるためです。

  3. これを実現する最も簡単な方法は、全体をjavascript関数にすることです。ページ上でvariable(int)を宣言し、ロード時に0に設定します。次に、ボタンがクリックされたときに、カウンターをチェックする必要があります。0より大きい場合は1つのメッセージが表示され、0より大きい場合は別のメッセージが表示されます。これは、条件が非常に基本的な場合にのみ機能します(非常に複雑になる可能性がありますが、それがやり過ぎになることもあります)。

したがって、私の意見では、これらの3つのオプションは、必要なことをすべて処理できるはずです。1つ目は非常に使いやすく、2つ目は非常に用途が広く、サーバーとの通信にXMLまたはJSONを実装すると非常に強力になり、3つ目は毎回サーバーと通信するよりもはるかに高速です。どちらが最適かはあなた次第です。

于 2013-02-14T15:51:00.240 に答える
0

スクリプトを囲むためのスクリプトタグを追加しませんでした。

機能の追加

strScript = "<script type=\"text/javascript\">";
strScript = "function MyMsg()"
strScript += "{"
strScript += "alert(document.getElementById('TextBox3').value);"
strScript += "}"
strScript = "</script>";
ClientScript.RegisterStartupScript(Me.GetType(), "MyMsg", strScript, True)

関数を呼び出す

ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "<script type=\"text/javascript\">MyMsg();</script>", True)
于 2013-02-12T09:22:21.020 に答える