AutoCompleteExtender иногда работает - PullRequest
       15

AutoCompleteExtender иногда работает

0 голосов
/ 29 декабря 2008
    [System.Web.Services.WebMethod]
    [System.Web.Script.Services.ScriptMethod]
    public string[] GetRowsByFilter(string prefixText, int count)
    //public static List<string> GetRowsByFilter(string prefixText)
    {
        DataTable table = ds.Tables[0];
        string filter = "stShortName LIKE '" + prefixText.Replace("'", "''") + "%'";
        DataRow[] foundRows;
        List<string> items = new List<string>(count);

        foundRows = table.Select(filter);
        if (foundRows.Length > 0)
        {
             for (int i = 0; i < foundRows.Length; i++)
            {
                items.Add((string)foundRows[i]["stShortName"]);
            }
            return items.ToArray();
        }
        else
        {
            items.Add("No '" + prefixText + "' items found");
            return items.ToArray();
        }
    }

и

<ajaxToolkit:AutoCompleteExtender 
    id="AutoCompleteExtenderTxtSite" 
    BehaviorID="AutoCompleteEx"
    Runat="server" 
    Targetcontrolid="txtSiteASP"
    ServiceMethod="GetRowsByFilter"
    MinimumPrefixLength="1" 
    CompletionInterval="1000"
    EnableCaching="false"
    CompletionSetCount="10" 
    CompletionListCssClass="autocomplete_completionListElement" 
    CompletionListItemCssClass="autocomplete_listItem" 
    CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem"
    DelimiterCharacters=";, :"
    ShowOnlyCurrentWordInCompletionListItem="true" 
  >
    <Animations>
        <OnShow>
            <Sequence>
                <OpacityAction Opacity="0" />
                <HideAction Visible="true" />
                <ScriptAction Script="
                    // Cache the size and setup the initial size
                    var behavior = $find('AutoCompleteEx');
                    if (!behavior._height) {
                        var target = behavior.get_completionList();
                        behavior._height = target.offsetHeight - 2;
                        target.style.height = '0px';
                    }" />
                <Parallel Duration=".4">
                    <FadeIn />
                    <Length PropertyKey="height" StartValue="0" EndValueScript="$find('AutoCompleteEx')._height" />
                </Parallel>
            </Sequence>
        </OnShow>
        <OnHide>
            <Parallel Duration=".4">
                <FadeOut />
                <Length PropertyKey="height" StartValueScript="$find('AutoCompleteEx')._height" EndValue="0" />
            </Parallel>
        </OnHide>
    </Animations>
</ajaxToolkit:AutoCompleteExtender>

Большая часть этого прямо с примера веб-сайта Toolkit. Я также сделал это, используя веб-сервис точно так же, как из примера, за исключением заполнения массива из базы данных. Оба заполняют массив безупречно, и оба иногда работают. Недостаток производительности, они кажутся идентичными.

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

1 Ответ

1 голос
/ 11 марта 2009

Я обнаружил, что если выполнение кода на стороне сервера занимает много времени, то запрос AJAX на стороне клиента, похоже, истекает.

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

Проверьте, кэширован ли ваш DataSet и, если нет, сколько времени потребуется для его извлечения? Проверьте индексы базы данных. Sql LIKE запросы лучше оптимизированы в SQL Server 2005.

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

...