【问题标题】:How to call webmethod in Asp.net C#如何在 Asp.net C# 中调用 webmethod
【发布时间】:2013-10-07 06:11:15
【问题描述】:

我想使用下面的代码在asp.net c#应用程序中调用一个web方法

Jquery:

jQuery.ajax({
    url: 'AddToCart.aspx/AddTo_Cart',
    type: "POST",
    data: "{'quantity' : " + total_qty + ",'itemId':" + itemId + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    beforeSend: function () {
                  alert("Start!!! ");
               },
    success: function (data) {
                 alert("a");
              },
    failure: function (msg) { alert("Sorry!!! "); }
    });

C# 代码:

[System.Web.Services.WebMethod]
public static string AddTo_Cart(int quantity, int itemId)
{
    SpiritsShared.ShoppingCart.AddItem(itemId, quantity);      
    return "Add";
}

但它总是调用page_load。我该如何解决?

【问题讨论】:

  • 你从哪里进行 ajax 调用?
  • 很奇怪。调用谁的 page_load? AddToCart.aspx?
  • 是的,调用 AddToCart.aspx/Page_load

标签: c# jquery asp.net ajax webmethod


【解决方案1】:

$.Ajax() 的很多元素如果定义不正确可能会导致问题。我建议以最基本的形式重写您的 javascript,您很可能会发现它工作正常。

脚本示例:

$.ajax({
    type: "POST",
    url: '/Default.aspx/TestMethod',
    data: '{message: "HAI" }',
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        console.log(data);
    },
    failure: function (response) {
        alert(response.d);
    }
});

WebMethod 示例:

[WebMethod]
public static string TestMethod(string message)
{
     return "The message" + message;
}

【讨论】:

  • 这是一个很好的起点。由于此示例有效,因此您可以将其一点一点地更改为您需要的内容,看看什么时候出了问题,然后您就知道问题出在哪里了。
【解决方案2】:

这有点晚了,但我只是偶然发现了这个问题,试图解决我自己的这类问题。然后我意识到我在 ajax 帖子中的这一行是错误的:

data: "{'quantity' : " + total_qty + ",'itemId':" + itemId + "}",

应该是:

data: "{quantity : '" + total_qty + "',itemId: '" + itemId + "'}",

以及WebMethod:

public static string AddTo_Cart(string quantity, string itemId)

这解决了我的问题。

希望对其他人也有帮助。

【讨论】:

    【解决方案3】:

    解决这个问题 ;)

    您需要更改作为字符串化 JSON 发送的数据,这样您就可以将 Ajax 调用模块化为一个可支持的函数。

    第一步:提取数据构造

    /***
     * This helper is used to call WebMethods from the page WebMethods.aspx
     * 
     * @method - String value; the name of the Web Method to execute
     * @data - JSON Object; the JSON structure data to pass, it will be Stringified
     *      before sending
     * @beforeSend - Function(xhr, sett)
     * @success - Function(data, status, xhr)
     * @error - Function(xhr, status, err)
     */
    function AddToCartAjax(method, data, beforeSend, success, error) {
        $.ajax({
            url: 'AddToCart.aspx/', + method,
            data: JSON.stringify(data),
            type: "POST",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            beforeSend: beforeSend,
            success: success,
            error: error
        })
    }
    

    第二步:泛化WebMethod

    [WebMethod]
    public static string AddTo_Cart ( object items ) {
        var js = new JavaScriptSerializer();
        var json = js.ConvertToType<Dictionary<string , int>>( items );
    
        SpiritsShared.ShoppingCart.AddItem(json["itemId"], json["quantity"]);      
        return "Add";
    }
    

    第三步:在需要的地方调用它

    这几乎可以在任何地方调用,JS 文件、HTML 文件或服务器端构造。

    var items = { "quantity": total_qty, "itemId": itemId };
    
    AddToCartAjax("AddTo_Cart", items,
        function (xhr, sett) {  // @beforeSend
            alert("Start!!!");
        }, function (data, status, xhr) {   // @success
            alert("a");
        }, function(xhr, status, err){  // @error
            alert("Sorry!!!");
        });
    

    【讨论】:

      【解决方案4】:

      这里的一个问题是,当您从 ajax 调用传递字符串时,您的方法需要 int 值。如有必要,尝试将其更改为字符串并在 web 方法中解析:

      [System.Web.Services.WebMethod]
      public static string AddTo_Cart(string quantity, string itemId)
      {
          //parse parameters here
          SpiritsShared.ShoppingCart.AddItem(itemId, quantity);      
          return "Add";
      }
      

      编辑:或从 ajax 调用传递 int 参数。

      【讨论】:

      • 应该可以直接从ajax调用传递int值?
      • @AlessioCavaleri 除非您在传递之前明确转换为 int 然后是,否则它会期望字符串值...
      【解决方案5】:

      我不确定为什么这不起作用,它在我的测试中运行良好。但这里有一种替代技术可能会有所帮助。

      不调用AJAX url中的方法,只需使用页面.aspx url,并将方法作为参数添加到数据对象中。然后当它调用 page_load 时,您的数据将在 Request.Form 变量中。

      jQuery

      jQuery.ajax({
          url: 'AddToCart.aspx',
          type: "POST",
          data: {
              method: 'AddTo_Cart', quantity: total_qty, itemId: itemId
          },
          dataType: "json",
          beforeSend: function () {
              alert("Start!!! ");
          },
          success: function (data) {
              alert("a");
          },
          failure: function (msg) { alert("Sorry!!! "); }
      });
      

      C# 页面加载:

      if (!Page.IsPostBack)
      {
          if (Request.Form["method"] == "AddTo_Cart")
          {
              int q, id;
              int.TryParse(Request.Form["quantity"], out q);
              int.TryParse(Request.Form["itemId"], out id);
              AddTo_Cart(q,id);
          }
      }
      

      【讨论】:

      • 虽然这种变通方法可以让你的代码正常工作,但这是一种糟糕的做法,当你不得不维持这种悲惨的混乱局面时,你未来的自己无疑会对你感到失望
      • 我投了反对票,因为这是一个 hacky 工作,我认为不会帮助处于与 OP 相同情况的人们。
      【解决方案6】:

      问题出在[System.Web.Services.WebMethod],添加[WebMethod(EnableSession = false)],您可以摆脱页面生命周期,默认情况下,EnableSession 在页面中为真,并通过生命周期事件使页面进入生命周期..

      更多详情请参考以下页面 http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx

      【讨论】:

        【解决方案7】:

        您需要在发送之前JSON.stringifydata parameter

        【讨论】:

          【解决方案8】:

          这是你的答案。 使用

                             jquery.json-2.2.min.js 
                                and
                             jquery-1.8.3.min.js
          

          Javascript:

          function CallAddToCart(eitemId, equantity) {
             var itemId = Number(eitemId);
             var quantity = equantity;
             var dataValue = "{itemId:'" + itemId+ "', quantity :'"+ quantity "'}" ;
              $.ajax({
                     url: "AddToCart.aspx/AddTo_Cart",
                     type: "POST",
                     dataType: "json",
                     data: dataValue,
                     contentType: "application/json; charset=utf-8",
                     success: function (msg) {
                          alert("Success");
                     },
                     error: function () { alert(arguments[2]); }      
                  });
           }
          

          你的 C# web 方法应该是

          [WebMethod]
          [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
          public static string AddTo_Cart(int itemId, string quantity)
          {
             SpiritsShared.ShoppingCart.AddItem(itemId, quantity);      
            return "Item Added Successfully";
          }
          

          从任何按钮click 或任何其他html 控件event,您可以使用参数调用javascript 方法,然后调用webmethod 以获取json 格式的值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-04
            • 1970-01-01
            • 2013-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多