Проблемы с AutoCompleteExtender

Я использую AutoCompleteExtender в ASP.NET/C# для извлечения данных из моей базы данных вместе с первичным ключом поля. Когда имя выбрано, детали (имя/pk) извлекаются еще до нажатия кнопки «Отправить», а затем передаются в скрытое поле.

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

Вот мой сервис автозаполнения:

 public string[] GetAutoComplete(string prefixText, int count)
    {

        string connection = ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString;
        string sql = "SELECT * FROM SageAccount WHERE Name LIKE @prefixText AND Customer = 1 AND SageID IS NOT NULL";
        SqlDataAdapter da = new SqlDataAdapter(sql, connection);
        da.SelectCommand.Parameters.Add("@prefixText", SqlDbType.VarChar, 50).Value = prefixText + "%";
        DataTable dt = new DataTable();
        da.Fill(dt);
        List<string> Names = new List<string>();
        foreach (DataRow dr in dt.Rows)
        {
            Names.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(dr["Name"].ToString() + " (" + dr["SageID"].ToString() + ")", dr["ID"].ToString()));
        }

        return Names.ToArray();

    }

И JavaScript, используемый для заполнения скрытого поля:

function autoCompleteItemSelected(source, eventArgs) {
            var assocHiddenField = document.getElementById(source.get_id() + '_hidden');
            assocHiddenField.value = eventArgs.get_value();
        }

Каков наилучший способ сбросить скрытое поле, если результаты не возвращаются? В настоящее время у меня есть «частично работающее» решение, которое представляет собой этот фрагмент JavaScript:

   function pageLoad() {

    $find('txtName')._onMethodComplete = function(result, context) {


        $find('txtName')._update(context, result, false);
        webservice_callback(result, context);
    };


}
function webservice_callback(result, context) {
    var hiddenfield = document.getElementById('txtName_hidden');
    if (result == "")
        hiddenfield.value = '0';
}

Но если пользователь очень быстро нажимает ввод/нажимает кнопку «Отправить», он не сбрасывается. Если они не щелкают в течение секунды или двух, это работает и сбрасывает скрытое поле на 0.

Есть еще идеи, ребята?


person Chris    schedule 28.10.2010    source источник


Ответы (2)


Попробуйте использовать $addHandler для подключения к нажатие клавиши событие текстового поля. Очистите скрытое поле в этом обработчике событий:

$addHandler($get("txtName"), "keypress", function(e) {
    $get("txtName_hidden").value = "";
}, true);
person Frédéric Hamidi    schedule 28.10.2010
comment
Я обдумывал это, но подумал о возможности того, что они начнут печатать, решив не искать, а затем щелкнув ссылку на экране, например, на другую страницу в представлении сетки — если это произойдет, это скажет, что учетной записи нет. - person Chris; 28.10.2010
comment
Просто у меня была мозговая волна с использованием вашего решения - если я использую нажатие клавиши, чтобы стереть скрытое поле, тогда я мог бы просто установить сеанс, чтобы он стал истинным, когда пользователи нажимают кнопку «Отправить» - если сеанса нет или он ложный, когда страница загружается, тогда вернуться к старым данным. - person Chris; 28.10.2010
comment
Интересно, что происходит, когда пользователь выбирает все и вырезает с помощью мыши. - person MIWMIB; 13.02.2017

Вы можете установить свойство OnClientPopulating расширителя автозаполнения AJAX на JS, который очищает скрытое поле.

function ClearHidden(source, eventArgs) {
        document.getElementById('<%=this.hdnUsrIdSel.ClientID%>').value = null;
}

<ajaxToolkit:AutoCompleteExtender ID="autoCompleteExtend" runat="server" 
        MinimumPrefixLength="1" ServiceMethod="GetCompletionList" 
        FirstRowSelected="true" 
        ServicePath="~/WebServices/Autocomplete.asmx" TargetControlID="txtUsers" 
        UseContextKey="True" CompletionSetCount ="10" 
        OnClientPopulating="ClearHidden" 
person user1121070    schedule 20.02.2012