为什么Delphi 2007 ASP.NET AJAX调用返回[object Object]

时间:2011-02-06 00:20:24

标签: ajax delphi asp.net-2.0 delphi-2007

有没有人成功使用Delphi 2007中支持AJAX的ASP.NET Web应用程序向导来进行ajax调用?如果是这样,那么让它发挥作用的秘诀是什么。

我问两个原因。首先,我所尝试的似乎并不奏效。其次,我已经广泛搜索了Web,并且没有看到任何暗示AJAX实际上在使用ASP.NET 2.0的Delphi 2007中工作的示例或讨论。

这是发生了什么。我使用.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应用程序执行后看到的是一个警告窗口,其中包含“Success:[object Object]”

那么,为了重复这个问题,是否有人成功使用Delphi 2007中支持AJAX的ASP.NET Web应用程序向导进行ajax调用?如果是这样,那么让它发挥作用的秘诀是什么。


在检查回调函数中返回的值之后(根据Wouter建议使用FireFox和FireBug),以下是简单示例中对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的Scripts属性中的外部JavaScript文件。为简单起见,我在此处将JavaScript包含在HTML文件中。

1 个答案:

答案 0 :(得分:3)

还没有人回答过这个问题,所以让我至少试着以某种方式提供帮助。

上面的ShowObjectInfo函数让我觉得你目前没有使用FireBug

为了加快调试过程,您可以这样做:

  1. 确保您已安装FireFox和FireBug;
  2. 按F12显示FireBug窗格;
  3. 加载您的网页
  4. 转到萤火虫script标签;
  5. 通过点击排水沟区域,在您呼叫alert的行添加断点;
  6. 刷新页面;
  7. 检查result变量,看看你有什么。