Не удается получить автозаполнение jQuery для работы с внешним JSON
Я работаю над приложением ASP.NET, где мне нужно автозаполнение jQuery. В настоящее время ничего не происходит, когда я печатаю данные в поле ввода txt63 (и, прежде чем вы меня задумали за использование имени типа txt63, я знаю, я знаю... но это не мой вызов: D).
Вот мой код 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. Я пытаюсь заставить его работать с новым, потому что я слышал, что CDN "dev" будет устаревшим.
Любая помощь или направление будет принята с благодарностью.
1 ответ
Что ж, после нескольких часов работы над этим я получил свой 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