Использование страницы .aspx в качестве обработчика событий Ajax?

0

В течение нескольких дней я общался с вызовами 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>

Между тем, у меня есть функция с кодом "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, результат, который заканчивается на "testytext" div, является необработанным html для всей страницы, как если бы это было при обычных условиях запроса. Понятно, что моя попытка переопределить запрос страницы, создав реализацию кода IHttpHandler и поставляя метод "Overrides Sub ProcessRequest", не работает. Сервер по-прежнему обрабатывает запрос Ajax как обычный запрос, и на самом деле мой собственный метод "ProcessRequest" даже не называется.

Можно ли построить страницу/обработчик, как это? Как я могу перехватить входящий запрос от клиента и ответить соответствующим образом? Так работает Аякс, верно? Поэтому это должно быть возможно.

Опять же, я намеренно делаю это как упражнение, чтобы избежать использования "волшебных" элементов управления ASP, таких как UpdatePanels, поэтому, пожалуйста, не советуйте их использовать.

  • 0
    @ Ноэль, я склонен согласиться с Крисом ниже - вы можете просто создать другой ashx (или asmx в зависимости от ваших потребностей). Поскольку вышеописанное не работает, я предполагаю, что ваш заголовок запроса не достигает сервера - попробуйте установить точку останова в ProcessRequest в VS и проверить это.
Теги:

1 ответ

2
Лучший ответ

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню