2011-02-06 2 views
2

Кто-нибудь успешно использовал мастер веб-приложений ASP.NET с поддержкой AJAX в Delphi 2007 для создания ajax-вызовов? Если да, то в чем секрет, чтобы заставить его работать.Почему обратный вызов AJAX в Delphi 2007 возвращает объект [Object Object]

Прошу по двум причинам. Во-первых, то, что я пробовал, похоже, не работает. Во-вторых, я много искал в Интернете и не видел примеров или дискуссий, которые предполагают, что AJAX фактически работал в Delphi 2007 с ASP.NET 2.0.

Вот что происходит. Я построил приложение C#, поддерживающее AJAX (и соответствующий веб-сервис C#), используя .NET 4.0. Все было довольно просто, и оно работает так, как должно быть.

Я хотел бы назвать те же WebMethods из приложения ASP.NET Delphi 2007. К сожалению, пока клиент C# получает строки, возвращенные из различных WebMethods из веб-службы, клиент Delphi 2007 получает [объект 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> 

Очевидно, что веб-сервис фактически выполняется, так как звонки на более интенсивного процесса WebMethods занимает больше времени, чтобы вернуться. Тем не менее, то, что я вижу после выполнения из приложения Delphi, является предупреждающим окном, содержащим «Success: [object Object]»

Итак, чтобы повторить вопрос, кто-нибудь успешно использовал мастер ASP.NET ASP.NET с включенным AJAX в Delphi 2007 сделать айакс? Если да, то в чем секрет, чтобы заставить его работать.


После проверки значения, возвращаемого в функции обратного вызова (основано на использовании FireFox и FireBug, как было предложено Wouter), следующее исправление к 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. Когда вы это делаете, вы ссылаетесь на внешний файл или файлы JavaScript в свойстве Scripts ScriptManager. Для удобства я включил JavaScript в HTML-файл.

+1

Предложение Wouter приводит к мгновенному обнаружению происходящего. Объект, возвращаемый функцией обратного вызова, в случае успеха включал свойство с именем d, которое содержит строку, возвращаемую моим WebMethod. Я редактировал вопрос, чтобы включить решение и исправленный код. –

ответ

3

Никто еще не ответил на этот вопрос, поэтому позвольте мне хотя бы попытаться помочь так или иначе.

Функция ShowObjectInfo выше, заставляет меня думать, что вы не используете FireBug на данный момент.

Чтобы ускорить процесс отладки-процесс, вы можете сделать это:

  1. Убедитесь, что у вас есть FireFox и установил FireBug;
  2. Нажмите F12, чтобы отобразить панель FireBug;
  3. Загрузите веб-страницу
  4. Перейти к firebug script tab;
  5. Добавить точку останова в строке, где вы звоните alert, щелкнув по области водостока;
  6. Обновить страницу;
  7. Осмотрите переменную result, чтобы увидеть, что у вас есть.
+1

Большой совет. Хотя ваше решение не было фактическим ответом, я выбрал ваш пост как ответ, так как он сразу же приводит к ответу. Добавьте мое имя в список разработчиков, которые теперь безнадежно зацепились за Firebug. Ответ на мой вопрос появляется в комментарии к моему первоначальному вопросу. Спасибо! –