2017-03-20 20 views
0

検索でNonFactors.Mvc.Gridを使用しています。明白なものを見落とさない限り、私はas shown hereを実装しています。AJAX検索では、高速検索時に正確な結果が返されません。

@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%正確です。しかし、私が速く入力すると、結果はボード全体になります。時にはそれは正確ですが、ほとんどの場合、そうではありません。複数のスレッド間で狩猟とつつきことで

+0

多分ない元の問題を解決しますが、ユーザーが書き込みを停止するまで、私はAjaxの呼び出しを絞ることをお勧め何か。 – Chrille

+0

あなたが使用しているコントロールについてはわかりませんが、古い結果がサーバーより新しいものより速く、古い結果(「te」検索に関連すると言う)が新しいものを上書きする(「テスト」に関連している) – Evk

+0

検索する前に、ユーザーが入力を停止していることを確認する必要があります。私はx(500ms)を待つために私の検索機能にタイマーを置くでしょう。キーを押すと、タイマーが開始しているかどうかを確認して開始し、xを500msにリセットします。したがって、すべてのキーアップに対して、タイマーは500msにリセットされます。最後のキーアップから500ms後に検索が実行されます。あなたが検索機能を呼び出すときにタイマーを止めるのを忘れないでください。 – KevDevMan

答えて

0

、私はこの解決策を考え出した:

<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> 
+0

このアプローチは問題ありませんが、同じ問題を抱えていることに注意してください。 – Evk

+0

これを行うにはどうすればよいですか?現在の検索結果と一致しない場合に検索結果を破棄します –

+0

ajaxクエリを作成してそこに検索用語を渡します。 te "が" test "と等しくなく、このクエリの結果を破棄していることがわかります。 – Evk

関連する問題