UpdatePanel + AutoCompleteExtender + jQuery = Проблемы! - PullRequest
1 голос
/ 11 апреля 2011

У меня есть веб-форма ASP.NET, которая использует UpdatePanels для частичной обратной передачи страницы.В одной из моих UpdatePanels я использую AutoCompleteExtender из AjaxControlToolkit для вызова 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>

Но я также хочу отобразить выбранный текст ProjectName где-нибудь за пределами TextBox.Причина этого в том, что я хочу получить четкий способ визуально различать значение в TextBox, которое соответствует элементу в списке, возвращаемом AutoCompleteExtender, и любой старый посторонний текстовый остаток, который ничего не соответствует.Итак, я попытался отобразить выделенный текст в элементе управления Label, но как только происходит обратная передача, это значение исчезает.Я пытался использовать различные серверные и HTML-элементы управления, но поведение такое же ... за исключением элемента управления ASP.NET HiddenField.Я не уверен, почему этот элемент управления сохраняет эти значения во всех постбэках, а другие нет, но я все еще остался без полного решения.

Я обнаружил, что если метка, которую я использую для отображениязначение равно ВНЕ UpdatePanel, оно работает нормально, но то, как моя форма в настоящее время выложена, это не вариант.Я понимаю, что есть несколько лучших альтернатив использованию UpdatePanel, когда вам нужен более детальный контроль над тем, что обновлять при частичной обратной передаче страницы, но я бы предпочел не вдаваться в подробности, если есть более простое решение моей проблемы.

1 Ответ

1 голос
/ 11 апреля 2011

Ваш элемент управления Label очищается во время частичной обратной передачи, поскольку он находится в UpdatePanel, поэтому он обновляется, но нет условий для отправки его "значения" (фактически его внутреннего текста) обратно на сервер, поэтому обновление сбрасывает его.

Вам потребуется использовать веб-элемент управления, который может публиковать его текущее значение на сервере. Я бы предложил TextBox элемент управления в режиме только для чтения: он должен работать в большинстве браузеров, и вы можете настроить его так, чтобы он выглядел как ярлык.

...