有没有人成功使用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文件中。