2011-06-11 111 views
0

我需要在我的客户端页面中用JavaScript调用我的Web服务方法。我想我没有正确地引用这个正确的,并希望帮助搞清楚这一点,请。Asmx web服务引用问题

错误消息说“CalendarHandler未定义”

<%@ WebService Language="C#" CodeBehind="~/App_Code/CalendarHandler.cs" 
    Class="CalendarHandler" %> 

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" 
    AutoEventWireup="true" CodeFile="CalendarPage.aspx.cs" Inherits="CalendarPage" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server"> 

</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server"> 

     <input type="button" id="loadevents" onclick="callLoadEvents();" /> 
     <div id="eventresults"> </div> 
     <div id="resultFailed"> </div> 

     <script language="javascript" type="text/javascript"> 
      var tasks; 

      function callLoadEvents() { 

        Speak.CalendarHandler.GetEvents(GetLoadAddress_success, OnFailed); 
      } 
      function GetLoadAddress_success(e) { 
        tasks = e; 
      } 
      // -------------------------- 
      function OnFailed() { 
        $get('resultFailed').innerHTML = "failed"; 
      } 

     </script> 
</asp:Content> 



using System.Web; 
using System.Web.Services; 

[WebService(Namespace = "Speak")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
[System.ComponentModel.ToolboxItem(false)] 
public class CalendarHandler : System.Web.Services.WebService 
{ 
     static IDictionary<DateTime, String> Calendarevents;//hold my events in this 

    public CalendarHandler() { 
      Calendarevents = new Dictionary<DateTime, string>(); 
      Calendarevents.Add(DateTime.Now, "Going to meeting with XYZ Company"); 
      Calendarevents.Add(DateTime.Now.AddDays(1), "XML Class at 2pm"); 
      Calendarevents.Add(DateTime.Now.AddDays(1),"ASP.NET 3.5 Ajax"); 
      Calendarevents.Add(DateTime.Now.AddDays(1),"Pocket Guide"); 
      Calendarevents.Add(DateTime.Now.AddDays(1),"Grocery Shopping"); 

    } 

    [WebMethod] 
    public IDictionary<DateTime, String> GetEvents() 
    { 
     return Calendarevents; 
    } 

} 

您的帮助表示赞赏

回答

0

你在该页面的Master上有ScriptManager吗?

启用好的Namespace.Service.Method语法基本上有两个关键:MicrosoftAjax.js和特定于服务的JavaScript代理。

当您在页面上的任何位置拥有ScriptManager时(或者它是Master(s)),您将自动获得MicrosoftAjax.js。

要获得JavaScript代理,您需要在ScriptManager上包含一个ServiceReference,或者在JavaScript中包含一个指向其生成位置的JavaScript包含。例如: -

<asp:ScriptManagerProxy> 
    <Services> 
    <asp:ServiceReference Path="/CalendarHandler.asmx" /> 
    </Services> 
</asp:ScriptManagerProxy> 

<script> 
    // Speak.CalendarHandler.GetEvents() will be available here. 
</script>  

所有这一切实际上做的是注入的是(在调试运行时,或/ jsdebug)在/CalendarHandler.asmx/js的可用脚本。这是服务启用ScriptService属性的一部分。

所以,只要MicrosoftAjax.js已经被从什么地方在页面上注射,你也可以简单的脚本引用添加到JavaScript代理自己:

<script src="/CalendarHandler.asmx/js"></script> 

<script> 
    // Speak.CalendarHandler.GetEvents() will be available here. 
</script> 

更新:

如果服务代理生成代码不符合[WebService]属性中的Namespace参数,您是否可以使用namespace关键字命名空间服务代码?

namespace Speak 
{ 
    [ScriptService] 
    public class CalendarHandler : WebService 
    { 
    [WebMethod] 
    public IDictionary<DateTime, string> GetEvents() 
    { 
     // Etc. 
    } 
    } 
} 

我可以确认此方法确实会影响生成的服务代理。

+0

我从主页面scriptmanager中删除了servicereference,而是像上面在子页面中那样使用了scriptmanagerproxy。我仍然无法使用我为我的服务定义的名称空间调用webservice方法。 – Kobojunkie 2011-06-12 01:36:26

+0

我可以通过CalendarHandler.GetEvents(GetLoadAddress_success,OnFailed)调用我的引用;但不Speak.CalendarHandler.GetEvents(GetLoadAddress_success,OnFailed); – Kobojunkie 2011-06-12 01:37:40

+0

用替代方法更新。 – 2011-06-12 01:58:54

3

你需要序列化你在你的WebMethod以JSON和有回报的方法返回一个字符串(集合=实际上是你的collection = json的序列化输出)。

看看Encosia。它提供了关于asp.net,javascript和jquery一起工作的最全面的文章。

using System.Web.Script.Serialization; 


JavaScriptSerializer jss = new JavaScriptSerializer(); 
return jss.Serialize(CalendarEvents); 

而我宁愿用jquery来调用webservices。并注意d。前缀在asmx中。使用jquery进行消费时的web服务。

+0

感谢您的纠正。那么你能帮助解决参考问题吗?此外,我不能使用JQuery,因为它现在是不允许的。 – Kobojunkie 2011-06-11 14:11:44

+0

您也可以使用默认的asp.net ajax脚本库。它也可以工作,但我认为jQuery在进行ajax调用时语法更平滑(=写少)。 – marko 2011-06-11 16:30:45

+0

或者您可以使用pagemethods,然后完全取消使用webservices。 http://www.singingeels.com/Articles/Using_Page_Methods_in_ASPNET_AJAX.aspx – marko 2011-06-11 16:33:37