Я использую автозаполнение пользовательского интерфейса jQuery для текстового поля, которое выполняет обратный вызов обработчика ASP.NET .ashx.
JavaScript:
$partsSearch.autocomplete({
delay: 300,
source: '/Services/PartsCovered.ashx',
minLength: 3,
select: function(event, ui) {
$(event.target).val(ui.item.label);
findPartsByPhrase(ui.item.value);
return false;
},
focus: function(event, ui) {
$(event.target).val(ui.item.label);
return false;
}
});
C #:
[WebService(Namespace = "http://www.blah.co.uk/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class PartsCovered : IHttpHandler
{
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
context.Response.ContentType = "application/json";
List<AutoCompleteEntry> autoCompleteList = PartsUtils.PartSuggestionsGet(context.Request.QueryString["term"]);
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
context.Response.Write(jsSerializer.Serialize(autoCompleteList));
context.Response.End();
}
/// <summary>
///
/// </summary>
public bool IsReusable
{
get
{
return false;
}
}
}
РЕДАКТИРОВАТЬ: Добавление дополнительного кода C #:
public static List<AutoCompleteEntry> PartSuggestionsGet(string query)
{
List<AutoCompleteEntry> suggestions = new List<AutoCompleteEntry>();
using (SqlConnection sqlConnection = SqlDatabaseUtils.PortalSqlConnection)
{
try
{
SqlCommand sqlCommand = new SqlCommand("Parts_MatchBySearchPhraseGet", sqlConnection)
{
CommandType = CommandType.StoredProcedure
};
sqlCommand.Parameters.AddWithValue("@SearchPhrase", query);
sqlCommand.CommandTimeout = 1;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
DataTable results = new DataTable();
sqlDataAdapter.Fill(results);
foreach (DataRow row in results.Rows)
{
suggestions.Add(new AutoCompleteEntry(row["PartName"].ToString(), row["PartName"].ToString(), Convert.ToBoolean(row["Variant"])));
}
}
catch (Exception ex)
{
LoggingUtils.AddEntry("Part suggestions failed.", ex, typeof(PartsUtils), LoggingUtils.LogLevel.Warn);
}
}
suggestions.Sort();
return suggestions;
}
и хранимой процедуры:
ALTER PROCEDURE [dbo].[Parts_MatchBySearchPhraseGet]
@SearchPhrase nvarchar(50)
КАК НАЧАТЬ УСТАНОВИТЬ NOCOUNT ON;
(SELECT PartName,
Included,
0 AS Variant
FROM Parts_Covered
WHERE PartName LIKE '%' + @SearchPhrase + '%')
UNION ALL
(SELECT V.VariantName AS PartName,
P.Included,
1 AS Variant
FROM Parts_Covered AS P
INNER JOIN Parts_Covered_Variants AS V
ON P.PartID = V.PartID
WHERE V.VariantName LIKE '%' + @SearchPhrase + '%')
ORDER BY PartName ASC
END
Это работает большую часть времени, но затем перестает отвечать на запросы.В FireBug вы можете видеть, что запрос AJAX зависает, попытка получить доступ к любой другой странице на сайте также не отвечает, поэтому она должна быть веб-приложением.Я также выполнил профилирование базы данных, и это не зависает - запрос не выполняется до последнего момента, пока запрос не вернется к жизни.
Любые предложения приветствуются.
Dave