我在ASP.NET / C#中使用AutoCompleteExtender从我的数据库中检索数据,以及该字段的主键。选择名称后,即使在单击“提交”之前,也会检索详细信息(名称/ 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。
还有其他想法吗?
答案 0 :(得分:5)
您可以将AJAX auto complete extender的OnClientPopulating属性设置为清除隐藏字段的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"
答案 1 :(得分:0)
尝试使用$addHandler附加到文本框的keypress事件。清除该事件处理程序中的隐藏字段:
$addHandler($get("txtName"), "keypress", function(e) {
$get("txtName_hidden").value = "";
}, true);