我有一个 ASP.NET Web 表单,它使用 UpdatePanels 来允许部分页面回发。在我的一个 UpdatePanel 中,我使用 AjaxControlToolkit 中的 AutoCompleteExtender 在我的页面上调用 WebMethod 以异步检索 ProjectNames 列表及其关联的 ProjectID 值。当我从列表中选择一个项目时,我使用 jQuery 将 ProjectID 值保存到 HiddenField 服务器控件。当我单击 UpdatePanel 中的提交按钮以执行数据库查询时,我需要此值。到目前为止,一切都很好。这是相关的客户端代码:
<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>
但是,我还想在 TextBox 之外的某处显示选定的 ProjectName 文本。这样做的原因是我想要一种清晰的方法来直观地区分与 AutoCompleteExtender 返回的列表中的项目匹配的 TextBox 中的值和不匹配任何内容的任何旧的无关文本。因此,我尝试在 Label 控件中显示选定的文本,但是一旦发生回发,该值就会消失。我尝试过使用各种服务器和 HTML 控件,但行为是相同的……除了 ASP.NET HiddenField 控件。我不知道为什么这个控件在回发时保留这些值,而其他控件没有,但我仍然没有完整的解决方案。
我发现,如果我用来显示值的标签在 UpdatePanel 之外,它可以正常工作,但是我的表单当前布局的方式,这不是一个选项。我意识到当您需要更精细地控制在部分页面回发期间要更新的内容时,使用 UpdatePanel 有一些更好的选择,但如果有更简单的解决方案可以解决我的问题,我现在不想深入研究。