2010-07-26 83 views
0

我使用jQuery自動完成與asp.net mvc 2下的文本框,並且一切正常。我鍵入搜索並返回結果列表。但是,如果我鍵入一些字符,然後退格並刪除文本框中的所有文本,我想要默認的項目列表出現。 Unfortunatley調用我的控制器的ajax不會在退格和刪除所有文本後觸發。如果文本框中沒有文本,jQuery自動完成返回空列表

我需要提到的一件事我以稍微不同的方式使用自動完成功能。我正在使用自動完成功能來充當過濾機制。當用戶輸入到文本框中時,會發出ajax調用,並將結果注入到div標籤中。我不希望在文本框下面顯示標準下拉菜單,我只是想使用自動完成功能提供的功能,以便在輸入過濾器字符串時動態顯示頁面中的項目列表。

我這樣做是因爲結果列表的數量是幾百個,並且能夠輸入幾個字符,返回一個過濾結果使其在列表中找到一個項目的速度更快。

爲了解決這個問題,我嘗試在文本框onchange/onkeypress/onkeyup事件中掛鉤,並檢查文本框中是否有任何文本,以及是否顯示默認列表。但它又不想爲我工作。就好像當文本從文本框中刪除時文本框事件不會觸發。

我想找到一種方法,以便當文本框中的文本被刪除時,會自動執行默認搜索。

這裏是我的html ...

<% using (this.Html.BeginForm("Filter", "Guilds")) 
     {%> 
     Filter: 
    <input type="text" name="SearchFilterText" value="" id="filterTextBox" onkeyup="onfilterchange();" /> 
    <% 
     }%> 
     <script type="text/javascript"> 
      $(function() { 
       $("#filterTextBox").autocomplete({ 
        source: [""], 

        search: function (event, ui) { 
         populatelist(); 
         return true; 
        }, 
        minLength: 1, 
        delay: 300 
       }); 
      }); 
       </script> 
    <div id="success"> 
     <% Html.RenderPartial("GuildList", this.Model); %> 
    </div> 
    <div id="error"> 
    </div> 

,這裏是我的頭節腳本....

 


    
       function populatelist() { 
        var url = "/FilteredGuilds///"; 
        $.ajax({ 
         url: url + $("#filterTextBox").val(), 
         dataType: "html", 
         success: function(response, status, xhr) { 
          $('#success').html(response); 
          $("#error").html(""); 
         }, 
         error: function(response, status, xhr) { 
          if (status == "error") { 
           $("#success").html(""); 
           var msg = "Sorry but there was an error: "; 
           $("#error").html(msg + xhr.status + " " + xhr.statusText); 
          } 
         }    
        }); 
       } 

       function onfilterchange(){ 
        if($("#filterTextBox").val() == null | $("#filterTextBox").val() ==""){ 
        populatelist(); 
        } 
       } 
       

這裏是我的控制器行動....

 


[HttpGet] 
     public PartialViewResult Filter(string realm, DateTime date, string filter) 
     { 
      var guildNames = this._repository.GetGuildNames(date, realm); 
      if (string.IsNullOrEmpty(filter)) return PartialView("GuildList", guildNames); 
      return PartialView("GuildList", guildNames.Where(x => x.Name.ToLower().Trim().Contains(filter.ToLower().Trim())).ToList()); 
     } 

+0

有關更多詳細信息,請參閱下面的答案。我的直覺是,你的字符串過濾器爲空會導致控制器動作出錯。你有沒有把調試停止在那個返回部分?另外,我注意到你的url部分在jquery代碼中是var url =「/ FilteredGuilds ///」;.我不確定你如何從那裏'過濾'? (另外,爲什麼額外的///字符? – 2010-07-26 10:38:38

回答

0

Dean,

I thi如果問題'可能'與$ .ajax緩存相關,則將您先前的選擇保留在本地緩存中。您可以通過添加減輕這在一定程度上:

$.ajaxSetup({ cache: false }); 

然而,這顯然意味着你typedown(如果從文本框中刪除字符)將始終查詢數據庫,所以對性能將造成衝擊。

我還建議您在螢幕控制檯中做詳細的追蹤,因爲這會顯示請求發生時發生的任何錯誤。您可能會發現空/空字符串會導致控制器上出現錯誤,並且螢火蟲會突出顯示此錯誤。

jim