2011-06-11 106 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