javascriptjqueryasp.netjsonihttphandler

Can't get jQuery AutoComplete to work with External JSON


I'm working on an ASP.NET app where I'm in need of jQuery AutoComplete. Currently there is nothing happening when I type data into the txt63 input box (and before you flame me for using a name like txt63, I know, I know... but it's not my call :D ).

Here's my javascript code

<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);
    }
  });
});

and here is my HTTP Handler

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

The rest of my ASPX page has the appropriate controls as I had this working with the old version of the jQuery library. I'm trying to get it working with the new one because I heard that the "dev" CDN was going to be obsolete.

Any help or direction will be greatly appreciated.


Solution

  • Well, after a bunch of hours working on this, I got my iHttpHandler delivering data fairly nicely. Feel free to comment if you feel this could be better

    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