Динамическое отключение расширителя автозаполнения Ajax Control Toolkit

Я пытаюсь динамически включить / отключить элемент управления расширением автозаполнения из набора инструментов управления Ajax на основе выбора, сделанного пользователем в раскрывающемся списке.

В моем приложении ASP.NET 4.0 Webforms есть раскрывающийся список, и в зависимости от того, какая страна выбрана в нем, авторасширение почтового индекса должно быть включено или отключено.

Моя разметка:

<asp:DropDownList runat="server" ID="ddlCountries">
    <Items>
            <asp:ListItem Text="Switzerland" Value="CH" />
            <asp:ListItem Text="Germany" Value="D" />
            <asp:ListItem Text="Italy" Value="I" />
            <asp:ListItem Text="France" Value="F" />
    </Items>
</asp:DropDownList>
<br />

<asp:TextBox runat="server" ID="tbxZipcode" />

<asp:AutoCompleteExtender 
     runat="server" ID="acZipcode" BehaviorID="ZipcodeBehavior" 
     ServiceMethod="GetZipCode"
     TargetControlID="tbxZipCode" MinimumPrefixLength="1" CompletionInterval="15" 
     OnClientItemSelected="PopulateTextboxes" CompletionSetCount="25" />

При такой настройке срабатывает расширитель автозаполнения и отображает действительные швейцарские почтовые индексы - жизнь хороша :-)

ОДНАКО: если пользователь выбирает другую страну, я хочу остановить этот расширитель автозаполнения - у меня нет других почтовых индексов в моей базе данных для отображения, а для отображения швейцарских почтовых индексов Франция не имеет смысла.

Итак, я попробовал что-то вроде этого, чтобы захватить событие change в раскрывающемся списке.

$(document).ready(function () {
   $('#<%= ddlCountries.ClientID %>').change(function () {
      var chosenCountry = $(this).val();

      var behavior = $('#ZipcodeBehavior');

      if (chosenCountry == "CH") {
         behavior.disabled = '';
      } else {
         behavior.disabled = 'disabled';
      }
   });
});

Я могу получить ZipcodeBehavior нормально, но как только он у меня есть - кажется, что ничего больше не работает ...

Как динамически отключить AutocompleteExtender в Ajax Control Toolkit?

В разметке статически я использую

<asp:AutoCompleteExtender Enabled="False" .... />

а затем на моей странице ничего не отображается.


person marc_s    schedule 13.02.2013    source источник


Ответы (1)


Во-первых, вы не можете получить клиентский объект MicrosoftAjax с помощью селектора jQuery. Итак, этот синтаксис var behavior = $('#ZipcodeBehavior'); не имеет смысла. Вместо этого используйте $find("BehaviorID").

Чтобы добавить возможность отключения в AutoCompleteExtender, добавьте ссылку на этот скрипт в ScriptManager control:

Sys.Extended.UI.AutoCompleteBehavior.prototype.set_enabled = function (value) {
    try {
        $removeHandler(this.get_element(), "keydown", this._keyDownHandler);
    } catch (error) {} //just escape error if handler already removed
    this._timer.set_enabled( !! value);
    if (value) {
        this._keyDownHandler = Function.createDelegate(this, this._onKeyDown);
    } else {
        this._keyDownHandler = Function.createDelegate(this, function () {});
    }
    $addHandler(this.get_element(), "keydown", this._keyDownHandler);
};

После этого вы можете отключить / включить расширитель с помощью этого кода:

$('#<%= ddlCountries.ClientID %>').change(function () {
    var chosenCountry = $(this).val();
    $find("ZipcodeBehavior").set_enabled(chosenCountry == "CH");
});

Кстати, со свойством Enabled="false", указанным в разметке, я боюсь, что вам не следует включать расширитель на клиенте.

person Yuriy Rozhovetskiy    schedule 13.02.2013
comment
+1 Javascript действительно граничит с Черной Магией и Вуду .... :-) Я понятия не имею, что именно вы здесь делаете - но это работает как шарм! Спасибо! - person marc_s; 13.02.2013