wake-up-neo.com

Aufruf von webmethod in Asp.net C #

Ich möchte eine Webmethode in der asp.net c # -Anwendung mit folgendem Code aufrufen

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 # -Code:

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

Es wird aber immer page_load aufgerufen. Wie kann ich es reparieren? 

13

Es gibt einige Elemente von $.Ajax(), die Probleme verursachen können, wenn sie nicht korrekt definiert werden. Ich würde vorschlagen, Ihr Javascript in seiner grundlegendsten Form umzuschreiben, Sie werden höchstwahrscheinlich feststellen, dass es gut funktioniert.

Skriptbeispiel:

$.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-Beispiel:

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

Dies ist etwas spät, aber ich bin gerade über dieses Problem gestolpert und habe versucht, mein eigenes Problem dieser Art zu lösen. Mir wurde dann klar, dass ich diese Zeile im Ajax-Beitrag falsch hatte:

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

Es sollte sein:

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

Sowie die Webmethode:

public static string AddTo_Cart(string quantity, string itemId)

Und das hat mein Problem gelöst.

Ich hoffe, es kann auch jemand anderem helfen.

8
Frederik Moller

Ich bin nicht sicher, warum das nicht funktioniert. Es funktioniert gut bei meinem Test. Aber hier ist eine alternative Technik, die helfen könnte.

Anstatt die Methode in der URL AJAX aufzurufen, verwenden Sie einfach die URL der Seite .aspx und fügen Sie die Methode als Parameter in das Datenobjekt ein. Wenn dann page_load aufgerufen wird, befinden sich Ihre Daten in der 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!!! "); }
});

C # Page Load:

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

sie müssen JSON.stringify den data parameter eingeben, bevor Sie ihn senden.

0
Karlth

Ein Problem hierbei ist, dass Ihre Methode int-Werte erwartet, während Sie einen String vom ajax-Aufruf übergeben. Versuchen Sie, es in String zu ändern und bei Bedarf innerhalb der Webmethode zu analysieren: 

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

Edit : oder Übergeben Sie int-Parameter von einem Ajax-Aufruf.

0
Zaki

Das Problem ist bei [System.Web.Services.WebMethod], fügen Sie [WebMethod(EnableSession = false)] hinzu, und Sie könnten den Lebenszyklus der Seite entfernen. Standardmäßig ist EnableSession in Page gültig, sodass die Seite durch Lebenszyklusereignisse im Leben erscheint. 

Weitere Informationen finden Sie auf der folgenden Seite http://msdn.Microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx

0
user3411833

Necro'ing diese Frage;)

Sie müssen die als Stringified JSON gesendeten Daten ändern, um den Ajax-Aufruf zu einer einzigen unterstützbaren Funktion zu modulieren.

Erster Schritt: Extrahieren Sie die Datenerstellung

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

Zweiter Schritt: Generalisieren Sie 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";
}

Dritter Schritt: Nennen Sie es, wo Sie es brauchen

Dies kann fast überall aufgerufen werden, JS-Datei, HTML-Datei oder serverseitige Konstruktion.

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