2011-04-13 34 views
0

幾天來,我一直在使用不同的JavaScript,ASP控件和常規控件的組合來調試Ajax調用。我已經對發生的事情有了一些瞭解,但是使用ASP控件仍然隱藏了太多的機器,我希望有更深入的瞭解。有了這個目標,誰能告訴我爲什麼下面的設置不起作用?使用.aspx頁面作爲Ajax事件處理程序?

我有一個文件 「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」方法甚至不會被調用。

是否有可能建立一個像這樣的頁面/處理程序?我如何攔截來自客戶端的傳入請求並作出相應的響應?這就是Ajax的工作原理,對吧?所以它一定是可能的。

同樣,我故意這樣做是爲了避免使用諸如UpdatePanels之類的「魔術」ASP控件,因此請不要通知其使用。

+0

@Noel,我傾向於同意下面的Chris - 您可以創建一個不同的ashx(或根據您的需要asmx)。至於爲什麼上述不起作用,我的猜測是你的請求頭沒有到達服務器 - 嘗試在VS中的ProcessRequest中放置一個斷點並檢查它。 – VinayC 2011-04-14 04:02:51

回答

2

建立一個不同的文件,這是你的通用處理程序,不要將兩者結合起來。

通用處理程序(ashx的)和常規的網絡形式(的.aspx)在通用處理器有所不同,請不要運行一切正常,贏表單頁面處理,而是簡化事情不少。一般來說,你不希望整個頁面模型的這種情況,因此他們應該是不同的文件的原因。

如果你真的想在你的主要頁的方法,您會通過Ajax調用,再看看進入「的WebMethod」屬性。但是,我不會走這條路。

相關問題