AJAX комбинированный список добавления новых элементов без autopostback = "true" - PullRequest
0 голосов
/ 26 января 2011

Buenos nachos, если быть кратким, мой вопрос: возможно ли разрешить пользователям добавлять новые элементы в комбинированный список во время выполнения, не устанавливая для свойства autopostback значение true?Я понимаю, что необходимо выполнить обратную передачу, если добавлен новый элемент, но я не хочу, чтобы окно отправляло обратную передачу, если пользователь просто выбирает другое значение!

Ниже приведен тег, который у меня естьНе имея autopostback="true", поле со списком не позволяет пользователю добавлять новые элементы в поле> _ <'Любые мысли? </p>

<ajx:ComboBox ID="cbCompany" runat="server" Width="226px" DropDownStyle="DropDown"
  OnItemInserted="addCompany" AutoCompleteMode="SuggestAppend">
</ajx:ComboBox>

Я знаю, что могу добавить еще несколько элементов управления и сделатьлегкий обходной путь, просто интересно, можно ли это сделать таким образом.

Ответы [ 2 ]

1 голос
/ 26 января 2011

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

То, что анти-паттерн всего требует обратной передачи или использования ленивой версии .NET ajax (когда сервер работает с крошечными битами, такими как, например, добавление элементов в комбо), вообще не годится, и JavaScript должен сделать эти простые задачи.

Я загрузил исходный код для ComboBox ajaxcontroltoolkit и, к сожалению, у меня нет хорошего интерфейса JavaScript.

Вы можете попробовать отключить обратную передачу и использовать что-то вроде:

<script type="text/javascript">
function addItemToDumbComboBox(cb, text)
{
        /* Based upon Combobox.pre method initializeOptionList() */

        // create the new list item
        var child = document.createElement('li');
        child.innerHTML = text;
        cb.get_optionListControl().appendChild(liItem);

        // add the item to the internal collection
        var item = { text: text.trim(); };
        Array.add(cb._optionListItems, item);

        // style the ListItem with default skin
        cb.initializeOptionListItem(child);
}

addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #1");
addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #2");
addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #3");
</script>

... и посмотрим, что произойдет. Обратите внимание, что я на самом деле не тестировал этот код, это всего лишь пример.

Кстати, я рекомендую вам перейти к реализации комбинированного списка с приличным интерфейсом JavaScript.

Когда сервер выполняет всю работу, это все равно, что покупать тостер и каждый завтрак отправлять его на фабрику вместе с двумя кусками хлеба, чтобы они выпили за него и вернули его вам с тостами ... это глупость, но не вините себя, это распространенный антишаблон ASP.NET.

Надеюсь, что это помогает, и Бог благословит!

0 голосов
/ 27 января 2011

Отключите autopostback для выпадающего списка и попробуйте разместить что-то вроде фоллинга в конце вашей страницы.

<script type="text/javascript">
function subclassComboBox(cb)
{
    cb._old__onTextBoxBlur = cb._onTextBoxBlur;
    cb._onTextBoxBlur = function(e) {
        var saveAutoPostBack = cb.get_autoPostBack();
        cb.set_autoPostBack(false);

        cb._old_textBoxBlurHandler(e); 

        if (cb.get_selectedIndex() == -2) {
            /* -2 means that a custom value was typed. only in this case do postback */
            cb._doingPostBack = true;
            __doPostBack(cb.get_element().id, '');
        }

        cb.set_autoPostBack(saveAutoPostBack);
    };
    cb._old_textBoxBlurHandler = cb._textBoxBlurHandler;
    cb._textBoxBlurHandler = Function.createDelegate(cb, cb._onTextBoxBlur);

    $clearHandlers(cb.get_textBoxControl());
    $addHandlers(cb.get_textBoxControl(),
    {
        "click": cb._textBoxClickHandler,
        "focus": cb._textBoxFocusHandler,
        "blur": cb._textBoxBlurHandler,
        "keypress": cb._textBoxKeyPressHandler
    }, cb);
}

subclassComboBox(document.getElementById("cbCompany"));
</script>

Я не тестировал этот код, но идея состоит в том, чтобы сделать комбо выполнением обратной передачи только при вводе нового значения (даже если autopostback имеет значение false).Если это работает, вам больше не понадобится эта кнопка;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...