2010-05-28 32 views
0

我正在研究一个ASP.NET应用程序,我需要jQuery AutoComplete。当我在txt63输入框输入数据时(,以及在使用像txt63这样的名字之前,我知道,我知道......但它不是我的电话:D),目前没有任何事情发生。无法让jQuery AutoComplete与外部JSON一起工作

这里是我的javascript代码

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
     <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js" type="text/javascript"></script> 
     <script src="http://jquery-ui.googlecode.com/svn/tags/latest/external/jquery.bgiframe-2.1.1.js" type="text/javascript"></script> 
     <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/i18n/jquery-ui-i18n.min.js" type="text/javascript"></script> 
       <script language="javascript" type="text/javascript"> 

        var theSource = '../RegionsAutoComplete.axd?PID=<%= hidden62.value %>' 
        $(function() { 
         $('#<%= txt63.ClientID %>').autocomplete({ 
          source: theSource, 
          minLength: 2, 
          select: function (event, ui) { 
           $('#<%= hidden63.ClientID %>').val(ui.item.id); 
          } 
         }); 
        }); 

,这里是我的HTTP处理程序

Namespace BT.Handlers 
    Public Class RegionsAutoComplete : Implements IHttpHandler 
     Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable 
      Get 
       Return False 
      End Get 
     End Property 

     Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest 
      ''# the page contenttype is plain text' 
      context.Response.ContentType = "application/json" 
      context.Response.ContentEncoding = Encoding.UTF8 

      ''# set page caching' 
      context.Response.Cache.SetExpires(DateTime.Now.AddHours(24)) 
      context.Response.Cache.SetCacheability(HttpCacheability.Public) 
      context.Response.Cache.SetSlidingExpiration(True) 
      context.Response.Cache.VaryByParams("PID") = True 

      Try 
       ''# use the RegionsDataContext' 
       Using RegionDC As New DAL.RegionsDataContext 

        ''# query the database based on the querysting PID' 
        Dim q = (From r In RegionDC.bt_Regions _ 
          Where r.PID = context.Request.QueryString("PID") _ 
          Select r.Region, r.ID) 

        ''# now we loop through the array' 
        ''# and write out the ressults' 

        Dim sb As New StringBuilder 
        sb.Append("{") 

        For Each item In q 
         sb.Append("""" & item.Region & """: """ & item.ID & """,") 
        Next 
        sb.Append("}") 
        context.Response.Write(sb.ToString) 
       End Using 

      Catch ex As Exception 
       HealthMonitor.Log(ex, False, "This error occurred while populating the autocomplete handler") 
      End Try 
     End Sub 


    End Class 
End Namespace 

我的ASPX页面的其余部分有适当的控制,因为我有这个与旧版本的jQuery工作图书馆。我试图让它与新的一起工作,因为我听说“dev”CDN将会过时。

任何帮助或方向将不胜感激。

+0

我认为txt63是一个崇高的名字发表评论,我的名字我的第63个孩子这个欢乐的名字,并指责另一个我不能命名为别的:d – Gabriel 2010-05-31 05:12:22

+0

刚澄清。网站所有者已经构建了需要与此应用程序接口的应用程序和数据结构。数据库表只是一堆数字50 - 250或像这样一些愚蠢的东西。如果我要使用名字,那么我必须为下一个将名称映射到数据库的人建立一个参考指南......这样做更有意义。 – 2010-05-31 05:16:06

回答

0

那么,经过一段时间的工作后,我得到了我的iHttpHandler提供的数据相当不错。随意如果你觉得这可能是更好的

Imports System.Linq 
Imports System.Collections.Generic 

Namespace BT.Handlers 
    Public Class RegionsAutoComplete : Implements IHttpHandler 

     Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable 
      Get 
       Return False 
      End Get 
     End Property 

    Public Shared _PID As Integer 

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest 
     ''# the page contenttype is plain text' 
     context.Response.ContentType = "application/json" 
     context.Response.ContentEncoding = Encoding.UTF8 

     ''# set query string parameters into global variables' 
     Dim _term As String = If(context.Request.QueryString("term") <> "", context.Request.QueryString("term"), "") 
     _PID = Integer.Parse(context.Request.QueryString("PID")) 
     ''# create a string builder to store values' 
     Dim sb As New StringBuilder 
     sb.Append("[" & vbCrLf) 

     Dim item As BTRegionsList 

     Try 
      ''# now we loop through the array' 
      ''# and write out the ressults' 
      For Each item In BT.Handlers.RegionsAutoComplete.RegionsListInstance 
       ''# make sure the added items are valid to the search' 
       ''# we are also doing a case insensitive search' 
       If item.Region.ToLower.Contains(_term.ToLower) Then 
        ''# this is actually writing out some JSON data' 
        sb.Append(vbTab & "{ ""label"": """ & item.Region & """, ""value"": """ & item.Region & """, ""id"": """ & item.Id.ToString & """ }," & vbCrLf) 
       End If 
      Next 
     Catch ex As Exception 
      ''# log any errors to the Health Monitor' 
      HealthMonitor.Log(ex, False, "This error occurred while populating the autocomplete handler") 
     End Try 

     sb.Append("]") 

     ''# write out the string builder' 
     context.Response.Write(sb.ToString) 

     ''# set the string builder values to zero' 
     sb.Length = 0 
     sb = Nothing 
     item = Nothing 

    End Sub 

     ''# this is the instance of the BTRegionsList object' 
     Friend Shared _RegionsListInstance As List(Of BTRegionsList) 
     Friend Shared UsedPID As Integer ''# this is the PID of the most recent instance 
     Public Shared ReadOnly Property RegionsListInstance() As List(Of BTRegionsList) 
      Get 
       Dim r As New List(Of BTRegionsList) 
       ''# only populate the _RegionsListInstance if it is currently empty' 
       If _RegionsListInstance Is Nothing Or UsedPID = _PID Then 
        Using RegionDC As New DAL.RegionsDataContext 

         ''# query the database based on the querysting PID' 
         Dim q = (From reg In RegionDC.bt_Regions _ 
           Where reg.PID = Integer.Parse(HttpContext.Current.Request.QueryString("PID")) _ 
           Select reg.Region, reg.ID) 
         For Each item In q 
          r.Add(New BTRegionsList(item.ID, item.Region)) 
         Next 
         _RegionsListInstance = r 
        End Using 

       Else 
        ''# if _RegionsListInstance is not empty' 
        ''# then we want to set our BTRegionsList to ' 
        ''# equal _RegionsListInstance' 
        r = _RegionsListInstance 
       End If 

       ''# Set the PID for this instance' 
       UsedPID = _PID 

       ''# now we return our BTRegionsList' 
       Return r 
      End Get 
     End Property 

    End Class 

    ''# a singleton class to store region information' 
    ''# this helps us to not have to hit the database too many times' 
    Public Class BTRegionsList 

     Private _Region As String 
     Private _ID As Integer 

     Public Property Id() As Integer 
      Get 
       Return _ID 
      End Get 
      Set(ByVal value As Integer) 
       _ID = value 
      End Set 
     End Property 

     Public Property Region() As String 
      Get 
       Return _Region 
      End Get 
      Set(ByVal value As String) 
       _Region = value 
      End Set 
     End Property 

     Public Sub New(ByVal ID As Integer, ByVal Region As String) 
      _ID = ID 
      _Region = Region 
     End Sub 

    End Class 
End Namespace 
+0

很高兴你能帮到:) – 2010-05-31 05:10:02

+0

哈哈。这似乎工作,虽然我不确定是否从每个页面上的Singleton对象构建StringBuilder是一种禁食的方式,但它确实比每次击中数据库都快。如果任何人都可以提出更有效的方法,我会很乐意改变你的答案。 – 2010-05-31 05:17:26