.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