尝试从jQuery调用asmx方法时,'Namespace'未定义

时间:2010-10-11 21:00:09

标签: jquery asmx scriptmanager

我正在尝试使用jQuery访问asmx webservice中的方法。当我尝试执行下面的jquery调用时,我收到错误'MyNameSpace'未定义。

jquery调用webservice:

  MyNameSpace.MyWebService.MyMethod(parameter, function (e) { alert('Success') }, function (e) { alert('Failure') });

的ScriptManager:

  <asp:ScriptManager id="ScriptManager1" runat="server" >
     <Services>
       <asp:ServiceReference path="MyWebService.asmx" />
     </Services>
  </asp:ScriptManager>

MyWebService.asmx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Security;
using System.Web.Script.Services;


namespace MyNameSpace{
    [ScriptService]
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    //[System.Web.Script.Services.ScriptService]
    public class MyWebService : System.Web.Services.WebService
    {


        [WebMethod]
        public void MyMethod(string parameter)
        {
            //do some cool stuff


        }
    }
}

4 个答案:

答案 0 :(得分:2)

这是我的.asmx文件的问题,以及我将其移动到另一个文件夹的事实。要修复我的.asmx文件,我右键单击它并选择视图标记。类属性设置为错误的类,因此我的scriptmanager无法加载它。

答案 1 :(得分:1)

是的,我也犯了“我只是整理一下”......

如果您更改了程序集根命名空间,请确保在asmx文件本身的“inherits”属性中编辑引用。这并不总是很明显,因为VS不显示此文件的内容。

顺便说一句。暂时在脚本管理器上设置InlineScript =“True”将导致应用程序在这些情况下抛出实际异常,这样可以更容易地找出出错的地方。

(尽管OP已经回答了他们自己的问题,但我认为这个经验值得加入以供将来参考。)

答案 2 :(得分:1)

我要添加一个与上面给出的不同的答案。这是我最近遇到的一个边缘案例。

在我的情况下,我的脚本被加载时遇到了时间问题。这意味着,在Google Chrome上,我的脚本加载正常,并且能够访问WebService方法。但是,在IE11上,我的脚本无法加载,因为它在加载ScriptManager之前加载,因此,IE11无法查看命名空间以访问WebService方法。

关于如何解决此时间问题,有两种可能的建议。对于这个罕见问题,两者都不是可靠的银子弹。

将ScriptReference添加到ScriptManager

正如MSDN所述:

  

注册自定义脚本

     

使用ScriptManager控件管理您为参与部分页面更新的控件创建的资源。资源包括脚本,样式,隐藏字段和数​​组。 ScriptManager控件的Scripts集合包含浏览器可用的每个脚本的ScriptReference对象。您可以以声明方式或以编程方式指定脚本。   ScriptManager控件还公开了可用于以编程方式管理客户端脚本和隐藏字段的注册方法。注册支持部分页面更新的脚本或隐藏字段时,必须调用ScriptManager控件的注册方法。 (要注册部分页面更新不需要的脚本,请使用ClientScriptManager类的方法。)

换句话说,你必须像这样添加你的脚本:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <asp:ServiceReference Path="BackgroundService.asmx" />
    </Services>
    <Scripts>
        <asp:ScriptReference Path="Scripts/jquery-3.1.1.js" />
        <asp:ScriptReference Path="Scripts/customScript.js" />
        <asp:ScriptReference Path="Scripts/test_script_for_lulz.js" />
    </Scripts>
</asp:ScriptManager>

这样,ScriptManager就可以在加载脚本时引用它们。

在ScriptManager之后添加脚本

另一种方法是在您的<form runat="server">元素内添加ScriptManager之后的脚本,如下所示:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <asp:ServiceReference Path="BackgroundService.asmx" />
    </Services>
</asp:ScriptManager>

<%-- Your scripts come after ScriptManager --%>
<script type="text/javascript" src="Scripts/jquery-3.1.1.js"></script>
<script type="text/javascript" src="Scripts/test_script.js"></script>
<script type="text/javascript" src="Scripts/lulz_script_again.js"></script>

这样,由于浏览器读取标记语言的方式,然后在ScriptManager完成加载后加载脚本。

同样,无法保证哪种解决方案比另一种解决方案更好。这是我遇到的时间问题,这就是全部。

答案 3 :(得分:0)

要注意的另一件事是,请确保您以正确的数据类型传递参数。同样的问题发生在我身上,我忘了将数组转换为服务器端方法接受的字符串。