Como chamar webmethod em Asp.net C#

Quero chamar um método web em asp.net aplicação C# usando o seguinte código

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ódigo C# :

[System.Web.Services.WebMethod]
public static string AddTo_Cart(int quantity, int itemId)
{
    SpiritsShared.ShoppingCart.AddItem(itemId, quantity);      
    return "Add";
}
Mas chama-se sempre "page_load". Como posso consertá-lo?

Author: Renaissance, 2013-10-01

8 answers

Isto é um pouco tarde, mas tropecei neste problema, tentando resolver o meu próprio problema deste tipo. Então percebi que tinha esta linha errada no posto ajax.
data: "{'quantity' : " + total_qty + ",'itemId':" + itemId + "}",

Deve ser:

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

Assim como o WebMethod para:

public static string AddTo_Cart(string quantity, string itemId)
E isto resolveu o meu problema. Espero que possa ajudar outra pessoa também.
 8
Author: Frederik Moller, 2014-11-08 21:55:35

Existem alguns elementos do $.Ajax() que podem causar problemas se não forem definidos correctamente. Eu sugeriria reescrever o seu javascript na sua forma mais básica, você provavelmente vai achar que ele funciona bem.

Script example:

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

Webmetod exemplo:

[WebMethod]
public static string TestMethod(string message)
{
     return "The message" + message;
}
 8
Author: JDandChips, 2016-06-29 08:04:45
Não sei porque é que isso não está a funcionar, mas funciona bem no meu teste. Mas aqui está uma técnica alternativa que pode ajudar.

Em vez de chamar o método na url AJAX, basta usar a página .aspx url, e adicionar o método como um parâmetro no objeto de dados. Então, quando ele chama page_load, seus dados estarão no pedido.Form variable.

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# Carga Da Página:

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);
    }
}
 1
Author: Bryan, 2013-10-01 19:45:17

Um problema aqui é que o seu método espera valores int enquanto está a passar a corda da chamada ajax. Tente alterá - lo para string e processar dentro do webmethod se necessário:

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

Editar : ou passar os parâmetros int da chamada ajax.

 0
Author: Zaki, 2013-10-01 08:51:40

O problema é em [System.Web.Services.WebMethod], adicione [WebMethod(EnableSession = false)] e você pode se livrar do ciclo de vida da página, por padrão a Habilession é verdadeiro na página e fazer a página vir na vida através de eventos do ciclo de vida..

Por favor consulte a página abaixo para mais detalhes http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx

 0
Author: user3411833, 2014-08-15 14:54:56
JSON.amarrar o parâmetro de dados antes de enviá-lo.
 0
Author: Karlth, 2014-10-21 23:26:23

Necro ' esta pergunta;}

Você precisa mudar os dados que estão sendo enviados como JSON Stringificado, dessa forma você pode modularizar a chamada Ajax em uma única função supportável.

Primeiro passo: construção dos dados de extracção

/***
 * 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
    })
}

Segundo Passo: Generalizar O Webmetod

[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";
}

Terceiro passo: chama - o onde precisares.

Isto pode ser chamado em qualquer lugar, JS-file, HTML-file, ou construção do lado do servidor.

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
Author: GoldBishop, 2017-10-12 19:59:56
Aqui está a tua resposta. utilizar
                   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]); }      
        });
 }

E o teu método c# web deve ser

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

A partir de qualquer um dos botões click ou de qualquer outro controlo html event você pode ligar para o método javascript com o parâmetro que por sua vez chama para o webmethod para obter o valor no formato json.

 -1
Author: Chandan Kumar, 2017-03-07 03:49:18