1

我有一個ASP.NET Web窗體,它使用UpdatePanels來允許部分頁面回發。在我的一個UpdatePanel中,我使用AjaxControlToolkit中的AutoCompleteExtender來調用我的頁面上的WebMethod,以異步檢索ProjectNames及其關聯的ProjectID值的列表。當我從列表中選擇一個項目時,我使用jQuery將ProjectID值保存到HiddenField服務器控件中。當我點擊UpdatePanel中的提交按鈕來執行數據庫查詢時,我需要這個值。到目前爲止,一切都很好。這裏是相關的客戶端代碼:UpdatePanel + AutoCompleteExtender + jQuery =問題!

<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文本。原因是我想要一個清晰的方法來區分TextBox中與AutoCompleteExtender返回的列表中的項目匹配的值和任何不匹配任何內容的任何舊的無關文本。所以,我試圖在Label控件中顯示選定的文本,但一旦發生回發,該值就會消失。我試過使用各種服務器和HTML控件,但行爲是相同的...除了ASP.NET HiddenField控件。我不確定爲什麼這個控件在其他人不這樣做的時候會保留這些值,但是我仍然沒有一個完整的解決方案。

我發現如果我用來顯示值的標籤是UpdatePanel的外部,它工作正常,但我的表單目前的佈局方式,這不是一個選項。我意識到在部分頁面回發期間需要更細粒度地控制要更新的內容時,使用UpdatePanel會有一些更好的選擇,但是我現在寧願在此時研究如果有更簡單的解決方案。

回答

1

,因爲它駐留在UpdatePanelLabel控制期間部分回發被清除,所以它被刷新,但沒有提供發佈其「價值」(實際上它的內部文本)回服務器,所以刷新重置它。

您需要使用可以將當前值發回服務器的Web控件。我建議在只讀模式下使用TextBox控件:它應該適用於大多數瀏覽器,並且可以將其設置爲使其看起來像標籤。

+0

當我設置ReadOnly = true時,這不起作用,但它適用於Enabled = false。然後我設置:border-style = none;背景顏色:透明以獲得樣式的權利。最後,爲了防止它變得焦點,我將它保持爲Enabled(所以它不會變灰),然後將其添加到代碼隱藏中:this.txtSelectedProjectName.Attributes.Add(「onfocus」,「this.blur( );「); – PongGod 2011-04-11 20:06:42