web-dev-qa-db-fra.com

Comment appeler webmethod en Asp.net C #

Je souhaite appeler une méthode Web dans l'application asp.net c # à l'aide du code suivant

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!!! "); }
    });

Code C #:

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

Mais il appelle toujours page_load. Comment puis-je le réparer? 

13

Il y a pas mal d'éléments de la $.Ajax() qui peuvent causer des problèmes s'ils ne sont pas définis correctement. Je suggérerais de réécrire votre javascript dans sa forme la plus élémentaire, vous constaterez probablement qu'il fonctionne correctement.

Exemple de script:

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

Exemple de WebMethod:

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

C'est un peu tard, mais je suis tombé sur ce problème, essayant de résoudre mon propre problème de ce genre. J'ai alors réalisé que j'avais mal écrit cette ligne dans le message ajax:

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

CA devrait etre:

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

Ainsi que le WebMethod à:

public static string AddTo_Cart(string quantity, string itemId)

Et cela a résolu mon problème.

J'espère que cela pourra être utile à quelqu'un d'autre.

8
Frederik Moller

Je ne sais pas pourquoi cela ne fonctionne pas, cela fonctionne bien pour mon test. Mais voici une technique alternative qui pourrait aider.

Au lieu d'appeler la méthode dans l'URL AJAX, utilisez simplement l'URL de la page .aspx et ajoutez-la en tant que paramètre dans l'objet de données. Ensuite, lorsqu'il appelle page_load, vos données seront dans la variable 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!!! "); }
});

Chargement de la page 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);
    }
}
1
Bryan

vous devez JSON.stringify le data parameter avant de l'envoyer.

0
Karlth

Un problème ici est que votre méthode attend des valeurs int lorsque vous passez une chaîne depuis un appel ajax. Essayez de le changer en chaîne et d’analyser dans la méthode Web si nécessaire: 

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

Edit : ou Transmettre les paramètres int de l'appel ajax.

0
Zaki

Le problème est à [System.Web.Services.WebMethod], ajoutez [WebMethod(EnableSession = false)] et vous pourriez vous débarrasser du cycle de vie d'une page, par défaut, EnableSession est vrai dans Page et que la page apparaisse dans la vie par le biais d'événements de cycle de vie. 

Veuillez vous reporter à la page ci-dessous pour plus de détails http://msdn.Microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx

0
user3411833

Necro'ing cette question;)

Vous devez modifier les données envoyées sous forme de fichier JSON Stringified afin de modulariser l'appel Ajax en une seule fonction pouvant être prise en charge.

Première étape: extraire la construction des données

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

Deuxième étape: généraliser 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";
}

Troisième étape: Appelez-le là où vous en avez besoin

Cela peut être appelé à peu près n'importe où, fichier JS, fichier HTML ou construction côté serveur.

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
GoldBishop