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