如何在Asp.net C#中调用WebMethod

18

我想在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调用的? - nunespascal
非常奇怪。谁调用了page_load?AddToCart.aspx? - Renaissance
是的,请调用AddToCart.aspx/Page_load。 - Balwant Chaudhary
8个回答

18

如果$.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;
}

3
这是一个很好的起点。既然这个例子可行,你可以逐渐进行修改以满足自己的需求,并观察在哪个环节出现问题,这样你就能确定问题所在了。 - adinas

8
这有点晚了,但我刚刚遇到了这个问题,试图解决自己的类似问题。后来我意识到我的ajax post中这行代码写错了:
data: "{'quantity' : " + total_qty + ",'itemId':" + itemId + "}",

应该是这样的:

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

除了WebMethod之外,还有以下技术:

public static string AddTo_Cart(string quantity, string itemId)

这解决了我的问题。

希望对其他人也有所帮助。


2

重新激活这个问题 ;)

您需要将发送的数据更改为字符串化的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
    })
}

Second Step: Generalize 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!!!");
    });

0

在发送数据之前,您需要对data参数进行JSON.stringify处理。


0

0
这里的一个问题是你的方法期望 int 值,而你从 ajax 调用中传递的是字符串。尝试将其更改为字符串,并在必要时在 webmethod 中解析:
[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值吗? - Alessio
@AlessioCavaleri,除非你在传递之前明确地将其转换为int类型,否则它会期望字符串值... - Zaki

0

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

不要在 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);
    }
}

6
尽管这种方法可以让你的代码运行,但这是不好的做法,当你必须维护这个糟糕的混乱时,你未来的自己肯定会对你感到失望。 - JDandChips
我添加了一个踩的反对意见,因为这是一个笨拙的解决方法,我认为它不会帮助到其他处于同样情况的人。 - Morvael

-1

这是你的答案。使用

                   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格式的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接