UpdatePanels を使用して部分的なページのポストバックを許可する ASP.NET Web フォームがあります。UpdatePanels の 1 つで、AjaxControlToolkit の AutoCompleteExtender を使用してページで WebMethod を呼び出し、ProjectNames とそれに関連付けられた ProjectID 値のリストを非同期的に取得しています。リストから項目を選択するとき、jQuery を使用して ProjectID 値を HiddenField サーバー コントロールに保存しています。UpdatePanel 内の Submit ボタンをクリックしてデータベース クエリを実行するときに、この値が必要です。これまでのところ、すべてがうまく機能しています。関連するクライアント側のコードは次のとおりです。
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtProjectName" Width="200" ToolTip="Type the first few characters of the project to search for" runat="server"></asp:TextBox>
<ajaxToolkit:AutoCompleteExtender ID="AutoComplete1" TargetControlID="txtProjectName" MinimumPrefixLength="2"
CompletionInterval="250" CompletionSetCount="20" ServiceMethod="GetProjectCompletionList"
ServicePath="Default.aspx" runat="server" OnClientItemSelected="itemSelected" />
<asp:HiddenField ID="hdnProjectID" runat="server" />
<asp:Label ID="lblProjectName" runat="server"></asp:Label>
<script type="text/javascript">
function itemSelected(source, eventArgs) {
$get('<%= hdnProjectID.ClientID %>').value = eventArgs.get_value();
$get('<%= lblProjectName.ClientID %>').innerHTML = eventArgs.get_text();
}
</script>
<br /><br />
<asp:Button ID="btnSubmit" Text="Submit" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
しかし、選択した ProjectName テキストを TextBox の外のどこかに表示したいとも考えています。この理由は、AutoCompleteExtender によって返されたリスト内の項目と一致した TextBox 内の値と、何にも一致しなかった古い余分なテキストの残りを視覚的に区別する明確な方法が必要だからです。そこで、選択したテキストを Label コントロールに表示してみましたが、ポストバックが発生するとすぐにこの値が消えてしまいます。さまざまなサーバー コントロールと HTML コントロールを使用してみましたが、ASP.NET HiddenField コントロールを除いて動作は同じです。他のコントロールが保持しないのに、なぜこのコントロールがポストバック間でこれらの値を保持するのかはわかりませんが、まだ完全な解決策がありません。
値を表示するために使用しているラベルが UpdatePanel の外側にある場合、それは正常に機能することがわかりましたが、フォームが現在レイアウトされている方法では、これはオプションではありません。部分的なページのポストバック中に何を更新するかをより細かく制御する必要がある場合は、UpdatePanel を使用するよりも優れた代替手段がいくつかあることを認識していますが、私の問題に対するより簡単な解決策がある場合は、現時点でそれを掘り下げたいと思います。