【问题标题】:AJAX Search doesn't return accurate results when trying fast快速尝试时 AJAX 搜索不会返回准确的结果
【发布时间】:2017-03-20 15:42:46
【问题描述】:

我正在使用 NonFactors.Mvc.Grid 进行搜索。除非我忽略了一些明显的东西,否则我正在实施它as shown here

在父视图中,我有这条线生成网格:

@Html.AjaxGrid(Url.Action("UserSearch", new { }))

我有搜索文本框:

@Html.TextBoxFor(x => x.WildCardSearch, new { @class = "form-control per90 mt5 mr5 pull-left", placeholder = "Search", autofocus = "autofocus" })<i class="fa fa-125 fa-search"></i>

最终生成这个:

<input 
    autofocus="autofocus" 
    class="form-control per90 mt5 mr5 pull-left" 
    id="WildCardSearch" 
    name="WildCardSearch" 
    placeholder="Search" 
    type="text" 
    value="">

这是处理它的客户端方法:

$(document).on('keyup', '#WildCardSearch', function () {
    $('.mvc-grid').mvcgrid({
        query: 'search=' + this.value,
        reload: true
    });
});

这是执行搜索的服务器端方法:

public PartialViewResult UserSearch(string search)
{
    var results = // Initial query that returns an IQueryable of all the raw results. 

    if (!string.IsNullOrEmpty(search))
    {
        search = search.ToLower();
        results = from r in results
                  let bothNames = r.LastName + ", " + r.FirstName
                  where
                   r.FirstName.ToLower().Contains(search) ||
                   r.LastName.ToLower().Contains(search) ||
                   bothNames.ToLower().Contains(search) ||
                   r.Phone.Contains(search) ||
                   r.Email.Contains(search)
                  select r;
        }
        return PartialView(results);
}

现在,事情是这样的......

如果我在搜索文本框中输入非常缓慢,并等待每次按键处理,那么结果总是 100% 准确。但是,如果我打字速度很快,那么结果最终会变得一团糟。有时这是准确的,但大多数时候并不准确。

【问题讨论】:

  • 也许不能解决原始问题,但我建议限制 ajax 调用,直到用户停止写入。
  • 不知道您使用的控件,但问题表明旧结果有时来自服务器比新结果更快,因此旧结果(例如与“te”搜索相关)会覆盖新结果(与“测试”)。
  • 您需要确保用户在搜索前已停止输入。我会在我的搜索功能上放置一个计时器来等待 x(500 毫秒)。在按键上,检查计时器是否已启动并启动它,并将 x 重置为 500 毫秒。因此,对于每一个按键,计时器都会重置为 500 毫秒。搜索将在您最后一次启动后运行 500 毫秒。 (调用搜索功能时不要忘记停止计时器。

标签: c# jquery ajax asp.net-mvc


【解决方案1】:

通过在多个线程中寻找和啄食,我想出了这个解决方案:

<script>

//setup before functions
var typingTimer;                //timer identifier
var doneTypingInterval = 1000;  //time 1 seconds

//on keyup, start the countdown
$('#WildCardSearch').on("keyup", function () {
    if (typingTimer) clearTimeout(typingTimer);                 // Clear if already set     
    typingTimer = setTimeout(DoTheSearch, doneTypingInterval);
});

//on keydown, clear the countdown 
$('#WildCardSearch').on("keydown", function () {
    clearTimeout(typingTimer);
});

function DoTheSearch() {
   ... ajax call to the server
}

</script>

【讨论】:

  • 虽然这种方法很好,但请注意,它仍然会遇到同样的问题,尽管程度要小得多。要完全解决它,您需要在搜索运行时禁用输入,或者如果当前搜索与它们不匹配则丢弃搜索结果(更好)。
  • 如何做到这一点:如果当前搜索不匹配,则丢弃搜索结果
  • 您进行 ajax 查询并在那里传递一些搜索词,假设您传递“te”。当此查询的结果出现时,您检查原始搜索词是否与当前搜索词相同。假设结果出来时用户输入了“test”。您看到“te”不等于“test”并丢弃此查询的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多