我需要在客户端页面中使用JavaScript调用我的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 :(得分:3)
您需要将webmethod中的集合序列化为json,并使用return方法返回一个字符串(=实际上是集合的序列化输出= json)。
看看Encosia。它可以提供关于asp.net,javascript和jquery一起工作的最全面的文章。
using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Serialize(CalendarEvents);
我宁愿用jquery来调用webservices。并留意d。 asmx中的前缀。使用jquery使用它们时的webservices。
答案 1 :(得分:0)
你在那个页面的Master上有一个ScriptManager吗?
基本上有两个键可以启用漂亮的Namespace.Service.Method
语法:MicrosoftAjax.js和特定于服务的JavaScript代理。
当你在页面的任何地方(或者它的主人)有一个ScriptManager时,你会自动获得MicrosoftAjax.js。
要获取JavaScript代理,您需要ScriptManager上的ServiceReference或指向生成位置的JavaScript包含。 E.g:
<asp:ScriptManagerProxy>
<Services>
<asp:ServiceReference Path="/CalendarHandler.asmx" />
</Services>
</asp:ScriptManagerProxy>
<script>
// Speak.CalendarHandler.GetEvents() will be available here.
</script>
所有实际操作都是注入/CalendarHandler.asmx/js
(或者在调试中运行时为/ jsdebug)时可用的脚本。这是服务ScriptService
属性的一部分。
因此,只要MicrosoftAjax.js已经从页面的某个位置注入,您也可以自己简单地向该JavaScript代理添加脚本引用:
<script src="/CalendarHandler.asmx/js"></script>
<script>
// Speak.CalendarHandler.GetEvents() will be available here.
</script>
更新
如果服务代理生成代码不尊重Namespace
属性中的[WebService]
参数,您是否可以使用namespace关键字命名服务代码?
namespace Speak
{
[ScriptService]
public class CalendarHandler : WebService
{
[WebMethod]
public IDictionary<DateTime, string> GetEvents()
{
// Etc.
}
}
}
我可以确认这种方法确实会影响生成的服务代理。