Использование страницы .aspx в качестве обработчика событий Ajax? - PullRequest
0 голосов
/ 14 апреля 2011

В течение нескольких дней я возился с вызовами 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, поэтому, пожалуйста, не советуйте их использовать.

1 Ответ

2 голосов
/ 14 апреля 2011

Установите другой файл, который является вашим общим обработчиком, и не объединяйте их.

Универсальные обработчики (.ashx) и обычные веб-формы (.aspx) отличаются тем, что универсальные обработчики НЕ выполняют всю обычную обработку страницы выигрышной формы и вместо этого значительно упрощают вещи. Вообще говоря, вам не нужна полная страница модели для этой ситуации, поэтому причина, по которой они должны быть разными файлами.

Если вы действительно хотите иметь методы на вашей главной странице, которые вы будете вызывать через ajax, посмотрите в атрибут "WebMethod". Однако я бы не пошел по этому пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...