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?
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;
}
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.
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);
}
}
vous devez JSON.stringify
le data parameter
avant de l'envoyer.
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.
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
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.
/***
* 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]
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";
}
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!!!");
});