1

.NET の CompositeControl クラスから継承するカスタム コントロールがあります。このコントロールは、子コントロールを動的に構築するために CreateChildControls をオーバーライドします。クライアント側でいくつかの異なる JavaScript イベントが発生した後、ページをポストバックする必要があります。

これを実現するために、ページに 2 つの隠しコントロールを作成して、JavaScript で値を設定し、ページを送信して、サーバー側で値を読み取ることができるようにします。これら 2 つの非表示を作成するために使用するコードは次のとおりです。

Protected Overrides Sub CreateChildControls()
    hdEventName = New HiddenField()
    Controls.Add(hdEventName)
    hdEventName.ID = "hdEventName"
    hdEventArgs = New HiddenField()
    Controls.Add(hdEventArgs)
    hdEventArgs.ID = "hdEventValue"
    ' other controls
    ' ...
End Sub

JavaScript イベントが発生すると、次のように 2 つの非表示の値属性を設定し、ページを送信します。

hdEventName.value = 'EventName';
hdEventArgs.value = 'arg1,arg2';
document.forms[0].submit();

コントロールの OnLoad メソッドで、hdEventName コントロールと hdEventArgs コントロールの Value プロパティをチェックしようとしましたが、常に空です。ただし、Page.Request.Form(hdEventName.UniqueID) と Page.Request.Form(hdEventArgs.UniqueID) は正しい値を返します。マークアップ内の実際の HTML も、ページがポストバックされた後に正しい値を示します。

HtmlInputHiddens の Value プロパティが、クライアントに表示される実際の値から切り離されているのはなぜですか?

更新 OnLoad が発生した後、コントロールのプロパティがフォームから読み込まれるようです。したがって、2 つの非表示フィールドをチェックするコードを OnPreRender メソッドに移動するか、次のメソッドをコードに追加することで、問題を解決できました。

Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
                                          Handles hdEventName.ValueChanged
    ' do stuff with hiddens
    ' ...

    ' reset the values back
    hdEventName.Value = String.Empty
    hdEventArgs.Value = String.Empty
End Sub
4

2 に答える 2

0

コントロールのプロパティは、OnLoadが発生した後のある時点でフォームからロードされるようです。したがって、2つの非表示フィールドをチェックするコードをOnPreRenderメソッドに移動するか、次のメソッドをコードに追加することで、問題を解決することができました-

Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
                                      Handles hdEventName.ValueChanged
    ' do stuff with hiddens
    ' ...

    ' reset the values back
    hdEventName.Value = String.Empty
    hdEventArgs.Value = String.Empty
End Sub
于 2010-03-16T20:57:56.670 に答える
0

ページがポストバックすると、変数 hdEventName を以前に作成したコントロールにリンクするものは何もありません。あなたがやっていることは、クラス レベルで整数を宣言し、子コントロールを作成するときにそれを 5 に設定することに似ています。ポストバック全体でその変数にその値を維持するものは何もありません。

以前に作成したコントロールへの参照を取得する場合は、使用する必要があります

hdEventName = CType(Page.FindControl("hdEventName") , HiddenField)

(私はこれを推測しています)または値のみに関心がある場合は Request 。

于 2010-03-16T20:37:58.703 に答える