AJAX组合框在没有autopostback的情况下添加新项目=“true”

时间:2011-01-25 22:46:11

标签: asp.net ajax combobox

布宜诺斯艾利斯,简而言之,我的问题是:是否可以允许用户在运行时将新项目添加到组合框而不将autopostback属性设置为true?我知道如果添加了一个新项目,它需要回发,但如果用户只是选择一个不同的值,我不希望该框回发!

我目前拥有的标签如下。如果没有autopostback="true",则comboxbox不允许用户向框添加新项> _<'有什么想法吗?

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

我知道我可以添加一些控件并做一个简单的解决方法,只是想知道是否可以这样做。

2 个答案:

答案 0 :(得分:1)

对于设计良好的组件中的每次更改,您不需要往返服务器,客户端应该能够处理大多数情况,除非服务器必须立即验证数据

所有内容的反模式都需要回发或使用.NET的懒惰版本的ajax(当服务器处理微小的部分时,例如,将项目添加到组合中)并不是很好,而JavaScript是可以做的那些简单的任务。

我下载了ajaxcontroltoolkit的ComboBox的源代码,不幸的是我没有提供良好的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界面​​的组合框实现。

让服务器完成所有工作就像买一个烤面包机和每个早餐邮寄到工厂,再加上2片面包,让他们做吐司,然后用吐司将它送回给你......这是那个愚蠢的,但不要怪自己,这是一个常见的ASP.NET反模式。

希望有所帮助,上帝保佑!

答案 1 :(得分:0)

禁用组合框的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)。如果这样可行,您将不再需要该按钮;)