Я пытался вызвать методы страницы из моего собственного кода JavaScript, но это не работает. Если я использую jQuery AJAX, я могу успешно вызывать методы страницы, но мне нужно сделать это из моего собственного кода JavaScript, потому что мы не можем использовать сторонние библиотеки (мы создаем нашу собственную библиотеку).
Всякий раз, когда я использую методы jQuery AJAX, я получаю результат метода страницы, а когда я использую свои собственные методы JS, я получаю целую страницу обратно из запроса AJAX.
Должно быть что-то другое в том, как jQuery обрабатывает запросы AJAX. Кто-нибудь знает, что это может быть?
Ниже приведен код, который я использую для вызова того же метода страницы с jQuery, который работает, и код, который я использую для его вызова самостоятельно.
JQuery
// JScript File
$(document).ready(function() {
$("#search").click(function() {
$.ajax({
type: "POST",
url: "Account.aspx/GetData",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
// Substitui o conteúdo da DIV vom o retorno do Page Method.
displayResult(msg);
}
});
});
});
Пользовательский JS
function getHTTPObject() {
var xhr = false;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
xhr = false;
}
}
}
return xhr;
}
function prepareLinks() {
var btn = document.getElementById("search");
btn.onclick = function() {
var url = "Account.aspx/GetData"
return !grabFile(url);
}
}
function grabFile(file) {
var request = getHTTPObject();
if (request) {
displayLoading(document.getElementById("result"));
request.onreadystatechange = function() {
parseResponse(request);
};
//Abre o SOCKET
request.open("GET", file, true);
//Envia a requisição
request.send(null);
return true;
} else {
return false;
}
}
function parseResponse(request) {
if (request.readyState == 4) {
if (request.status == 200 || request.status == 304) {
var details = document.getElementById("result");
details.innerHTML = request.responseText;
fadeUp(details,255,255,153);
}
}
}
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
addLoadEvent(prepareLinks);
ОБНОВЛЕНИЕ: Я решил принять Стивемегсона, так как его ответ был фактической причиной моей проблемы. Но я хотел бы поделиться с вами несколькими альтернативами, которые я нашел для этой проблемы.
Ответ Стивемегсона :
Все, что мне нужно было сделать, это перейти на POST-запрос и установить заголовок запроса на JSON, что решило мою проблему при запросе методов страницы, но сейчас у меня трудные времена при обработке ответа (я расскажу об этом подробнее) на другой вопрос).
Вот правильный код, чтобы получить этот материал:
print("function prepareLinks() {
var list = document.getElementById("search");
list.onclick = function() {
var url = "PMS.aspx/GetData"
return !grabFile(url);
} }");
print("function grabFile(file) {
var request = getHTTPObject();
if (request) {
//Evento levantado pelo Servidor a cada mudança de Estado na
//requisição assíncrona
request.onreadystatechange = function() {
parseResponse(request);
};
//USE POST
request.open('POST', file, true);
//SET REQUEST TO JSON
request.setRequestHeader('Content-Type', 'application/json');
// SEND REQUISITION
request.send(null)
return true;
} else {
return false;
}
}");
Ответ Брендана : Благодаря ответу Брендана я провел небольшое исследование интерфейса ICallBack и ICallBackEventHandler. К моему удивлению, это способ разработки aspx-страниц с использованием Microsoft AJAX Request. Это оказывается действительно интересным решением, так как для этого не требуется никакой библиотеки JS, и она находится внутри .Net Framework, и я полагаю, что об этом знают только немногие люди (по крайней мере, те, которые были вокруг меня, не знали). не знаю об этом вообще).
Если вы хотите узнать больше о ICallBack, проверьте этот текст ссылки в MS или просто скопируйте и вставьте ответ Брендана.
Третье решение: Другое решение, которое я нашел, состояло в том, чтобы вместо создания ASPX-страниц для обработки моего кода на стороне сервера я реализовывал HTML-страницы и вызывал файлы ASHX, которые выполняли бы те же функции, но использовали бы меньше полоса, чем страница ASPX. Одним из преимуществ этого решения является то, что я смог заставить его работать с запросами POST и GET. Ниже приведен код.
ASHX код:
print("Imports System.Web
Imports System.Web.Services
Public Class CustomHandler
Implements System.Web.IHttpHandler
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "text/plain"
Dim strBuilder As New System.Text.StringBuilder
strBuilder.Append("<p>")
strBuilder.Append("Your name is: ")
strBuilder.Append("<em>")
strBuilder.Append(context.Request.Form(0))
strBuilder.Append("</em>")
strBuilder.Append("</p>")
context.Response.Write(strBuilder.ToString)
End Sub
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get End Property End Class");
Файл JavaScript:
print("function prepareLinks() {
var list = document.getElementById("search");
list.onclick = function() {
var url = "CustomHandler.ashx"
return !grabFile(url);
}
}");
print("function grabFile(file) {
var request = getHTTPObject();
if (request) {
request.onreadystatechange = function() {
parseResponse(request);
};
//VERSÃO do POST
request.open('POST', file, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.send('name=Helton Valentini')
return true;
} else {
return false;
} }");
Используя любой из этих трех вариантов, мы можем совершать асинхронные вызовы без использования JQuery, используя наш собственный Javacript или используя ресурсы, встроенные в Microsoft .Net Framework.
Надеюсь, это поможет некоторым из вас.