【问题标题】:'Namespace' is undefined when trying to call asmx method from jQuery尝试从 jQuery 调用 asmx 方法时未定义“命名空间”
【发布时间】:2011-04-24 00:30:36
【问题描述】:

我正在尝试使用 jQuery 访问 asmx 网络服务中的方法。当我尝试执行下面的 jquery 调用时,我收到一个错误“MyNameSpace”未定义。

jquery 调用 web 服务:

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

脚本管理器:

  <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


        }
    }
}

【问题讨论】:

    标签: jquery asmx scriptmanager


    【解决方案1】:

    事实证明,我的 .asmx 文件存在问题,而且我已将其移至其他文件夹。要修复我的 .asmx 文件,我右键单击它并选择视图标记。类属性设置为错误的类,因此我的脚本管理器无法加载它。

    【讨论】:

      【解决方案2】:

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

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

      顺便说一句。在脚本管理器上临时设置 InlineScript="True" 将导致应用程序在这些情况下抛出实际异常,这使得找出问题所在变得容易得多。

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

      【讨论】:

      • 感谢 InlineScript 提示。将其设置为 True 后,显示了真正的错误。 (我错过了一个 dll)。
      【解决方案3】:

      我将添加与上面给出的答案不同的答案。这是我最近遇到的一个极端案例。

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

      关于如何解决此时间问题,有 2 条可能的建议。对于这个罕见的问题,两者都不是可靠的灵丹妙药。

      向 ScriptManager 添加 ScriptReference

      如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 之后添加脚本

      另一种方法是在 ScriptManager 之后添加脚本,在 &lt;form runat="server"&gt; 元素内,如下所示:

      <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 完成加载后加载。

      同样,不能保证哪个解决方案比另一个更好。这是我遇到的时间问题,仅此而已。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-10-28
          • 1970-01-01
          • 2020-04-29
          • 1970-01-01
          • 2018-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-29
          相关资源
          最近更新 更多