2012-07-16 64 views
0

我想顯示一些城市的自動完成使用jquery,當任何一個選擇城市,然後設置目的地ID隱藏字段。我正在使用Web服務來獲取Ajax調用的數據。jQuery的自動完成標籤價值undefined在asp.net

這裏是我的web服務方法:

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public List<BALDestinations> AuotExtenderDestination(string destinationname) 
    { 
     DataSet ds=objDestination.GetDestination(destinationname); 
     List<BALDestinations> result = new List<BALDestinations>(); 
     foreach (DataRow dr in ds.Tables[0].Rows) 
     { 
      BALDestinations b = new BALDestinations(); 
      b.City = dr["City"].ToString(); 
      b.DestinationId = dr["DestinationId"].ToString(); 
      result.Add(b); 
     } 
     return result; 
    } 

,這是我的jquery自動完成文本框擴展的

<script type="text/javascript"> 
    $(document).ready(function() { 
     SearchText(); 
     $('#btnSearch').click(function() { 
      alert($("#hiddenAllowSearch").val()); 
     }); 
    }); 
    function SearchText() { 
     $(".txtdest").autocomplete({ 
      // source: $local_source, 
      source: function (request, response) { 
       $.ajax({ 
        type: "POST", 
        contentType: "application/json; charset=utf-8", 
        url: "WebService.asmx/AuotExtenderDestination", 
        data: "{'destinationname':'" + $('.txtdest').val() + "'}", 
        dataType: "json", 
        success: function (data) { 
         response(data.d);      
        }, 
        error: function (result) { 
         alert("Error"); 
        } 
       }); 
      }, 
      focus: function (event, ui) { 
       $(".txtdest").val(ui.item.label); 
       return false; 
      }, 
      select: function (event, ui) { 
       $(".txtdest").val(ui.item.label); 
       $("#hiddenAllowSearch").val(ui.item.value); 
       return false; 
      } 
     }); 
    } 
</script> 

未定義出現在文本框輸入驗證碼,當我們鍵入任何有

+1

喜在我看來,我想你應該已經離開了代碼在你的問題,你原來它有。現在看到這個問題的任何人都不會看到你最初是如何編寫代碼的,因此無法看出差異並從Cory的答案中學習。我盯着你的代碼幾分鐘,認爲它沒有錯,直到我意識到你已經更新了它。 – 2012-07-16 19:19:13

+0

@Bruen對不起,我已經回滾我的編輯,現在問題與原來的相同。我只是做了編輯,因爲在cory答案後我面臨一個問題。你可以檢查cory和我對話的評論關於這個 – rahularyansharma 2012-07-16 19:50:24

+0

完全沒有問題,這是一個很好的問題,我認爲很多人,包括我自己都被這個迴應對象絆倒了。 – 2012-07-16 19:54:33

回答

2

如果您從Web服務返回的類的屬性不是labelvalue,那麼jQuery Autoco完整的代碼將嘗試從不存在的屬性讀取值,因此會出現undefined問題。

如果你不想改變你的類屬性,你可以設置自動完成來查看你的實際屬性名稱。而不是隻打電話response(data.d),您可以將您的類屬性labelvalue通過response功能發送之前手動映射:

response($.map(data.d, function (item) { 
    return { 
     label: item.City, 
     value: item.DestinationId 
    }; 
})); 
+0

只是'標籤'和'value'。 AFAIK,'id'在jQueryUI自動完成中沒有做任何特殊的事情。 – 2012-07-16 18:01:46

+0

@Cory先生我能夠得到像城市名稱標籤,但警報警報($(「#hiddenAllowSearch」))。VAL()); 它仍然顯示城市名稱,但我希望destinationId – rahularyansharma 2012-07-16 18:04:03

+0

@Cory thanx其問題是,如果他們沒有找到確切的價值部分,然後jquery使用標籤作爲價值,在我的情況下,問題是DestinationID vs DestinationId再次感謝它的完成 – rahularyansharma 2012-07-16 18:14:06

2

如果你想城市,州/省,國家的名字添加到標籤,而不是一個城市的名字,那麼你可以擴展你的代碼,並添加額外的值到自定義對象:

服務:

foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    BALDestinations b = new BALDestinations(); 
    b.City = dr["City"].ToString(); 
    b.DestinationId = dr["DestinationId"].ToString(); 
    b.State = dr["State"].ToString(); 
    b.Province = dr["Province"].ToString(); 
    b.Country = dr["Country"].ToString(); 

    result.Add(b); 
} 

阿賈克斯success回調:

response($.map(data.d, function (item) { 

    // return custom object 
    var resultList = { 
     label: item.City + ", " + item.State + ", " + 
       item.Province + "' " + item.Country, 
     value: item.DestinationId, 

     // Alternatively, you can return the properties in 
     // this object and display them via _renderItem  
     state: item.State, 
     province: item.Province, 
     country: item.Country 
    }; 

    return resultList; 
})); 

要顯示在自動完成列表中的狀態,省,國家,覆蓋_renderItem

$(".txtdest").autocomplete({ 
    source: function (request, response) { 
     // etc. 
    } 
}).data("autocomplete")._renderItem = function (ul, item) { 
    return $("<li></li>") 
    .data("item.autocomplete", item) 
    .append("<a><strong>" + item.value + "</strong><br>" + item.state + 
      " PROVINCE: " + item.province + " COUNTRY: " + item.country + "</a>") 
    .appendTo(ul); 
}; 
相關問題