Como chamar webmethod em Asp.net C#
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?
8 answers
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.
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;
}
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);
}
}
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.
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
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!!!");
});
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
.