В течение нескольких дней я возился с вызовами Ajax, используя различные комбинации javascript, ASP и обычные элементы управления. Я получил немного понимания о том, что происходит, но использование элементов управления ASP все еще скрывает слишком много оборудования, и я хочу иметь более глубокое понимание. С этой целью кто-нибудь может сказать мне, почему следующая установка не совсем работает?
У меня есть файл "Testy.aspx" со следующим:
<asp:Content>
<script type="text/javascript">
// a standard home-grown Ajax javascript method
function ajaxfunction() {
var ajaxObj = getAjaxObj(); // does the usual browser-detection
if (ajaxObj) {
ajaxObj.open("GET", "Testy.aspx", true);
ajaxObj.setRequestHeader("IsAjaxRequest", "true");
ajaxObj.send();
ajaxObj.onreadystatechange = function() {
if (ajaxObj.readyState == 4) {
document.getElementById("testytext").appendChild(document.createTextNode(ajaxObj.responseText));
}
}
}
}
</script>
... other unrelated html, ASP controls, etc...
<input id="testybutton" type="button" value="baroo" onclick="ajaxfunction()" />
<div id="testytext"></div>
</asp:Content>
Между тем, у меня есть функция code-behind "Testy.aspx.vb" со следующим:
Partial Public Class Testy
Inherits System.Web.UI.Page
Implements System.Web.IHttpHandler
...code for an ordinary (non-Ajax) request is in the middle here...
' Now I have code for Ajax requests
Overrides Sub ProcessRequest(ByVal context As HttpContext)
If context.Request.Headers("IsAjaxRequest") = "true" Then
context.Response.ContentType = "text/plain"
context.Response.Write("Hello World!")
Else
MyBase.ProcessRequest(context)
End If
End Sub
Overloads ReadOnly Property IsReusable() As Boolean
Get
Return False
End Get
End Property
End Class
Итак, я надеялся, что мой файл .aspx будет выполнять двойную функцию как в качестве обработчика запросов на обычной странице, так и в качестве обработчика запросов Ajax. Однако, когда я нажимаю кнопку («baroo»), чтобы сгенерировать Ajax-запрос, результатом, который в итоге записывается обратно в div «testytext», является необработанный html для всей страницы, как будто при нормальных условиях запроса. Ясно, что моя попытка переопределить запрос страницы, заставив программный код реализовать IHttpHandler и предоставить метод "Overrides Sub ProcessRequest", не работает. Сервер по-прежнему обрабатывает Ajax-запрос как обычный запрос, и фактически мой собственный метод ProcessRequest даже никогда не вызывается.
Можно ли построить страницу / обработчик, как это? Как я могу перехватить входящий запрос от клиента и ответить соответственно? Так работает Ajax, верно? Так что это должно быть возможно.
Опять же, я намеренно делаю это в качестве упражнения, чтобы избежать использования "волшебных" элементов управления ASP, таких как UpdatePanels, поэтому, пожалуйста, не советуйте их использовать.