2011-02-06 75 views
2

有沒有人成功使用Delphi 2007中啓用AJAX的ASP.NET Web應用程序嚮導來調用ajax?如果是這樣,那麼它的工作祕訣是什麼?爲什麼一個Delphi 2007 ASP.NET AJAX調用返回[object Object]

我問兩個原因。首先,我所嘗試過的似乎並不奏效。其次,我廣泛搜索了Web,並沒有看到任何示例或討論,暗示AJAX實際上在Delphi 2007中與ASP.NET 2.0一起工作。

這是發生了什麼事。我使用.NET 4.0構建了一個支持AJAX的C#應用​​程序(以及相應的C#Web服務)。這一切都非常簡單,而且它的工作原理應該是這樣。

我想從Delphi 2007 ASP.NET應用程序中調用相同的WebMethods。不幸的是,儘管C#客戶端接收到來自Web服務的各種WebMethods返回的字符串,但Delphi 2007客戶端接收到[object Object],並且它似乎有兩個未定義的屬性。我這樣說是因爲下面的代碼在用來接收結果時會顯示一個警告窗口,顯示「undefined undefined」。

function ShowObjectInfo(result) { 
var Name; 
var str; 
    for (Name in result) { 
    if (typeof result[name] !== 'function') { 
     str = str + ' ' + result[name] 
    } 
    } 
    window.alert(str); 
} 

這是我可以放在一起的最簡單的例子。這裏是我的ASPX文件:

<%@ Page language="c#" Debug="true" Codebehind="Default.pas" AutoEventWireup="false" Inherits="Default.TWebForm1"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<html> 
    <head runat="server"> 
    <title>Keeping it simple</title> 
    <script type="text/javascript"> 
     function OnLookup() 
     { 
     WebService.Echo('repeat after me', OnLookupComplete, OnError); 
     } 

     function OnLookupComplete(result) 
     { 
     window.alert('Success :' + result); 
     } 

     function OnError(result) 
     { 
     window.alert('Error ' + result); 
     } 
    </script> 
    </head> 
    <body> 
    <form runat="server"> 
     <asp:ScriptManager id="ScriptManager1" runat="server"> 
     <Services> 
      <asp:ServiceReference path="../../statisticsservice/statisticsservice.asmx"></asp:ServiceReference> 
     </Services> 
     </asp:ScriptManager> 
     <asp:UpdatePanel id="UpdatePanel1" runat="server"></asp:UpdatePanel> 
     <input value="Button" type="button" onclick="OnLookup();"> 
    </form> 
    </body> 
</html> 

顯然,Web服務被實際執行,因爲更多的工藝精深的WebMethods通話需要更長的時間來恢復。儘管如此,我從Delphi應用程序執行後看到的是一個警告窗口,其中包含「成功:[對象對象]」

因此,重複該問題,任何人都可以成功地使用啓用AJAX的ASP.NET Web應用程序嚮導在德爾福2007年做出Ajax調用?如果是這樣,那麼它的工作祕訣是什麼?


檢查在回調函數返回的值之後(基於使用FireFox和螢火作爲沃特建議的),以下是在簡單的例子修復的JavaScript。

function OnLookup() 
{ 
    WebService.Echo('repeat after me', OnLookupComplete, OnError); 
} 

function OnLookupComplete(result) 
{ 
    window.alert('Success :' + result.d); 
} 

function OnError(result){ 
    window.alert('Error ' + result._message); 
} 
</script> 

一些筆記。首先,我仍然不知道爲什麼在名爲d的屬性中找到了返回的字符串,但至少可以工作。其次,如果將JavaScript函數和變量聲明放在與HTML不同的文件中,則會更好。當你這樣做時,你可以引用ScriptManager的腳本屬性中的外部JavaScript文件或文件。爲了簡單起見,我在這裏將JavaScript包含在HTML文件中。

+1

Wouter的建議可以立即發現正在發生的事情。回調函數返回的對象成功時包含一個名爲d的屬性,其中包含返回的WebMethod字符串。我編輯了問題以包含解決方案和更正的代碼。 – 2011-02-06 15:19:52

回答

3

沒有人回答這個問題,所以讓我至少試着用某種方式來幫忙。

上面的ShowObjectInfo功能讓我覺得您目前沒有使用FireBug

要加快調試進程,你可以這樣做:

  1. 確保你有FireFox和安裝FireBug;
  2. 按F12顯示FireBug窗格;
  3. 加載您的網頁
  4. 轉到螢火蟲script選項卡;
  5. 通過單擊排水槽區域,在要調用alert的行上添加斷點;
  6. 刷新頁面;
  7. 檢查result變量,看看你有什麼。
+1

偉大的建議。雖然你的解決方案並不是真正的答案,但我已經選擇了你的文章作爲答案,因爲它立即引發了答案。把我的名字加到現在絕望地迷上了Firebug的開發者名單上。我的問題的答案出現在對我原來的問題的評論中。 謝謝! – 2011-02-06 14:45:30

相關問題