Каков наилучший метод устранения неполадок вызова jQuery AJAX с ASP.NET?Функция ошибки вызывается - я получаю всплывающее окно с предупреждением «Ошибка», но я не знаю почему.Когда я присоединяюсь к своему процессу (w3wp.exe) и помещаю точку останова в код моего общего метода-обработчика ProcessRequest, он на этом не останавливается.Так что это даже не до обработчика.Почему это так?
Это также только выполняет функцию ошибки каждый раз, когда я нажимаю на мою кнопку поиска (BtnUCSSearch).И у меня нет возможности нажать окей во всплывающем окне «Ошибка», как обычное предупреждение JavaScript.Мерцает и уходит.Я попытался вставить возвращаемое значение false, чтобы предотвратить обратную передачу всей страницы, но это не помогло.
Запрос страницы JavaScript:
jQuery("#<%=BtnUCSSearch.ClientID %>").click(function() {
urlToHandler = '/Accessioning/FullDataEntry/AddressSearch.ashx';
// hard coding input values for now
jsonData = '{ "CompanyName":"xxx", "PrimaryPhone":"555-555-5555", "PostalCode":"55555" }';
jQuery.ajax({
url: urlToHandler,
data: jsonData,
dataType: 'json',
type: 'POST',
contentType: 'application/json',
success: function(data) {
alert(data.UCSAddress);
},
error: function(data, status, jqXHR) {
alert('Error');
}
}); // end jQuery.ajax
});
Страница ответа для кода вызова AJAX (AddressSearch.ashx.vb):
Imports System
Imports System.Web
Imports System.Web.Services
Imports System.Web.HttpContext
<WebService([Namespace]:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class AddressSearch
Implements System.Web.IHttpHandler
Implements System.Web.SessionState.IReadOnlySessionState
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
Public Sub ProcessRequest(ByVal context As HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
context.Response.ContentType = "application/json"
Dim companyName As String = DirectCast(HttpContext.Current.Request.Form("CompanyName"), String)
Dim primaryPhone As String = DirectCast(HttpContext.Current.Request.Form("PrimaryPhone"), String)
Dim postalCode As String = DirectCast(HttpContext.Current.Request.Form("PostalCode"), String)
Dim json As String = "{ ""UCSAddress"": ""xxxxxxxxx"" }"
context.Response.Write(json)
End Sub
End Class
=============================
1/2/2012 @ 12:49 pm update
В соответствии с этими двумя ответами, я сделал немного больше устранения неполадок ..
способ, которым я получал параметры строки запроса, не работал с помощью формы.Так что теперь я использую QueryString вместо этого.Страница все еще правильно возвращала объект JSON.Но по крайней мере мои параметры строки запроса теперь должны работать.Однако в этом упражнении я явно вызывал свой универсальный обработчик непосредственно из браузера, а не через вызов jQuery.ajax.Так что я знаю, что теперь страница работает хорошо.
https://localhost/Accessioning/FullDataEntry/AddressSearch.ashx?CompanyName=xxx&PrimaryPhone=555-555-5555&PostalCode=55555
Ответ:
{"responseProperty": "xxxxxxxxx"}
Обратите внимание, я использовал оба метода ... даже подход, предложенный мистером Дуарте (JavaScriptSerializer).Они оба работают одинаково .. просто немного другая архитектура.Обратите внимание, что мне пришлось создать собственный класс с именем SimpleResponse.
Public Sub ProcessRequest(ByVal context As HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
' architecture #1 without JavaScriptSerializer (works)
context.Response.ContentType = "application/json"
Dim companyName As String = DirectCast(HttpContext.Current.Request.QueryString("CompanyName"), String)
Dim primaryPhone As String = DirectCast(HttpContext.Current.Request.QueryString("PrimaryPhone"), String)
Dim postalCode As String = DirectCast(HttpContext.Current.Request.QueryString("PostalCode"), String)
Dim json As String = "{ ""responseProperty"": ""xxxxxxxxx"" }"
context.Response.Write(json)
' architecture #2 with JavaScriptSerializer and SimpleResponse class (also works)
'context.Response.ContentType = "application/json"
'Dim json As JavaScriptSerializer = New JavaScriptSerializer()
'context.Response.Write(json.Serialize(New SimpleResponse()))
'http://codereview.stackexchange.com/questions/3208/basic-simple-asp-net-jquery-json-example
End Sub
Public Class SimpleResponse
Public Property responseProperty() As String
Get
Return _responseProperty
End Get
Set(ByVal value As String)
_responseProperty = value
End Set
End Property
Private _responseProperty As String
Public Sub New()
_responseProperty = "reponse via SimpleResponse class"
End Sub
End Class
================
Я также попытался обернуть мои jsonData с помощью JSON.stringify .. Я все еще получаю ошибку.Первоначально jQuery даже не вызывал страницу, потому что имя класса в обработчике имело «1» в конце.Когда я создал универсальный обработчик, он добавил «1», потому что у меня уже была страница и код позади класса с именем AddressSearch.aspx.С тех пор я исправил это.Мне пришлось искать «AddressSearch1», потому что я не мог напрямую редактировать файл, дважды щелкнув его в обозревателе решений.
<%@ WebHandler Language="VB" CodeBehind="AddressSearch.ashx.vb" Class="UI.Web.AddressSearch1" %>
===============
Теперь это по крайней мере вызывает мой код, но не передает параметры строки запроса с данными, которые я установил в jsonData (которые я также stringify'ed).Это также все еще выбрасывает ошибки.
Также поставьте "var" перед моими переменными JS.
Мы приближаемся.
jQuery("#<%=BtnUCSSearch.ClientID %>").click(function() {
var urlToHandler = 'AddressSearch.ashx';
//var urlToHandler = '~/Accessioning/FullDataEntry/AddressSearch.ashx';
//urlToHandler = '/Accessioning/FullDataEntry/AddressSearch.ashx';
// hard coding input values for now
var jsonData = '{ CompanyName:"xxx", PrimaryPhone:"555-555-5555", PostalCode:"55555" }';
//var jsonData = [{ CompanyName: "xxx", PrimaryPhone: "555-555-5555", PostalCode: "55555"}];
jQuery.ajax({
url: urlToHandler,
data: JSON.stringify(jsonData),
dataType: 'json',
type: 'POST',
contentType: 'application/json',
success: function(data) {
//alert("got here");
alert(data.responseProperty);
console.log(" .. response :" + data);
return false;
},
error: function(data, status, jqXHR) {
alert('Error');
//console.log("error :" + XMLHttpRequest.responseText);
//console.log(" .. error :" + data.responseText);
console.log(" .. error");
return false;
}
});
});
==========================
1/2/2012 @ 1:52 pm
фрагмент кода # 1 (запрос GET):
jQuery("#<%=BtnUCSSearch.ClientID %>").click(function() {
jQuery.get("AddressSearch.ashx", { CompanyName: "xxx", PrimaryPhone: "555", PostalCode: "55555" }, function(data) {
alert("got here");
//alert("Data Loaded: " + data.responseProperty);
return false;
});
});
страница вызова через страницу запроса (для # 1):
параметры: http://screencast.com/t/oA0i48O5y7
заголовки: http://screencast.com/t/3khfRjI7
ответ: ничего
вызов страницы через браузер напрямую (для # 1): https://localhost/Accessioning/FullDataEntry/AddressSearch.ashx?CompanyName=xxx&PrimaryPhone=555&PostalCode=55555 ответ (вывод страницы), хотя консоль ничего не говорит: {"responseProperty": "ответ через класс SimpleResponse"}
=====================
фрагмент кода # 2 (тип запроса POST):
var urlToHandler = 'AddressSearch.ashx';
var jsonData = '{ CompanyName:"xxx", PrimaryPhone:"555-555-5555", PostalCode:"55555" }';
jQuery.ajax({
url: urlToHandler,
data: JSON.stringify(jsonData),
dataType: 'json',
type: 'POST',
contentType: 'application/json',
success: function(data) {
if (data != null) {
alert(data.responseProperty);
console.log(" .. response :" + data);
}
return false;
},
error: function(data, status, jqXHR) {
if (data != null) {
alert("Error: " + data.responseText);
console.log(" .. error :" + data.responseText);
}
alert("error occurred");
return false;
}
});
страница вызова через страницу запроса (для# 2):
заголовки: http://screencast.com/t/ostM7NKCxT
post: http://screencast.com/t/VKZdgGuOl
ответ: http://screencast.com/t/LP3R8OAm
вызов страницы через браузер напрямую (для# 2): https://localhost/Accessioning/FullDataEntry/AddressSearch.ashx?CompanyName=xxx&PrimaryPhone=555&PostalCode=55555
ответ (вывод страницы), хотя консоль ничего не говорит: {"responseProperty": "ответ через класс SimpleResponse"}
============================
1/2/2012 @ 14:48
1094 * Окончательный код.Обратите внимание на e.preventDefault () и эту строку кода, чтобы предотвратить эту загадочную ошибку.Обе проблемы были оставшимися: jQuery ("# form"). Submit (function () {return false;});Хотя с вызовом e.preventDefault () вам не нужна другая строка.Поэтому я закомментировал это.
jQuery(document).ready(function() {
//jQuery("#form").submit(function() { return false; });
jQuery("#<%=TxtLastName.ClientID %>").focus();
//jQuery("#<%=PnlUCSSearch.ClientID %>").hide();
// START unassigned collection site address search logic
jQuery("#<%=DDLCollectionSite.ClientID %>").change(function() {
//alert("hello world: " + this.value);
if (this.value != "2") {
jQuery("#<%=PnlUCSSearch.ClientID %>").hide();
jQuery("#<%=DDLCollectionSite.ClientID %>").focus();
}
else {
jQuery("#<%=PnlUCSSearch.ClientID %>").show();
jQuery("#<%=TxtUCSCompany.ClientID %>").focus();
}
});
jQuery("#<%=BtnUCSSearch.ClientID %>").click(function(e) {
// jQuery.get("AddressSearch.ashx", { CompanyName: "xxx", PrimaryPhone: "555", PostalCode: "55555" }, function(data) {
// alert("Data Loaded: " + data.responseProperty);
// return false;
// });
var urlToHandler = 'AddressSearch.ashx';
//var urlToHandler = '~/Accessioning/FullDataEntry/AddressSearch.ashx';
//urlToHandler = '/Accessioning/FullDataEntry/AddressSearch.ashx';
// hard coding input values for now
var jsonData = '{ CompanyName:"xxx", PrimaryPhone:"555-555-5555", PostalCode:"55555" }';
//var jsonData = [{ CompanyName: "xxx", PrimaryPhone: "555-555-5555", PostalCode: "55555"}];
jQuery.ajax({
url: urlToHandler,
data: JSON.stringify(jsonData),
dataType: 'json',
type: 'POST',
contentType: 'application/json',
success: function(data) {
if (data != null) {
alert(data.responseProperty);
console.log(" .. response :" + data);
}
},
error: function(data, status, jqXHR) {
//if (data != null) {
// alert("Error: " + data.responseText);
// console.log(" .. error :" + data.responseText);
//}
//alert("error occurred");
}
});
e.preventDefault();
});
// END unassigned collection site address search logic
});