如何在 Asp.net C# 中调用 webmethod
Posted
技术标签:
【中文标题】如何在 Asp.net C# 中调用 webmethod【英文标题】:How to call webmethod in Asp.net C# 【发布时间】:2013-10-07 06:11:15 【问题描述】:我想使用下面的代码在asp.net c#应用程序中调用一个web方法
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# 代码:
[System.Web.Services.WebMethod]
public static string AddTo_Cart(int quantity, int itemId)
SpiritsShared.ShoppingCart.AddItem(itemId, quantity);
return "Add";
但它总是调用page_load。我该如何解决?
【问题讨论】:
你从哪里进行 ajax 调用? 很奇怪。调用谁的 page_load? AddToCart.aspx? 是的,调用 AddToCart.aspx/Page_load 【参考方案1】:$.Ajax()
的很多元素如果定义不正确可能会导致问题。我建议以最基本的形式重写您的 javascript,您很可能会发现它工作正常。
脚本示例:
$.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 示例:
[WebMethod]
public static string TestMethod(string message)
return "The message" + message;
【讨论】:
这是一个很好的起点。由于此示例有效,因此您可以将其一点一点地更改为您需要的内容,看看什么时候出了问题,然后您就知道问题出在哪里了。【参考方案2】:这有点晚了,但我只是偶然发现了这个问题,试图解决我自己的这类问题。然后我意识到我在 ajax 帖子中的这一行是错误的:
data: "'quantity' : " + total_qty + ",'itemId':" + itemId + "",
应该是:
data: "quantity : '" + total_qty + "',itemId: '" + itemId + "'",
以及WebMethod:
public static string AddTo_Cart(string quantity, string itemId)
这解决了我的问题。
希望对其他人也有帮助。
【讨论】:
【参考方案3】:解决这个问题 ;)
您需要更改作为字符串化 JSON 发送的数据,这样您就可以将 Ajax 调用模块化为一个可支持的函数。
第一步:提取数据构造
/***
* 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
[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";
第三步:在需要的地方调用它
这几乎可以在任何地方调用,JS 文件、html 文件或服务器端构造。
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!!!");
);
【讨论】:
【参考方案4】:这里的一个问题是,当您从 ajax 调用传递字符串时,您的方法需要 int 值。如有必要,尝试将其更改为字符串并在 web 方法中解析:
[System.Web.Services.WebMethod]
public static string AddTo_Cart(string quantity, string itemId)
//parse parameters here
SpiritsShared.ShoppingCart.AddItem(itemId, quantity);
return "Add";
编辑:或从 ajax 调用传递 int 参数。
【讨论】:
应该可以直接从ajax调用传递int值? @AlessioCavaleri 除非您在传递之前明确转换为 int 然后是,否则它会期望字符串值...【参考方案5】:我不确定为什么这不起作用,它在我的测试中运行良好。但这里有一种替代技术可能会有所帮助。
不调用AJAX url中的方法,只需使用页面.aspx url,并将方法作为参数添加到数据对象中。然后当它调用 page_load 时,您的数据将在 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# 页面加载:
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);
【讨论】:
虽然这种变通方法可以让你的代码正常工作,但这是一种糟糕的做法,当你不得不维持这种悲惨的混乱局面时,你未来的自己无疑会对你感到失望 我投了反对票,因为这是一个 hacky 工作,我认为不会帮助处于与 OP 相同情况的人们。【参考方案6】:问题出在[System.Web.Services.WebMethod]
,添加[WebMethod(EnableSession = false)]
,您可以摆脱页面生命周期,默认情况下,EnableSession 在页面中为真,并通过生命周期事件使页面进入生命周期..
更多详情请参考以下页面 http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx
【讨论】:
【参考方案7】:您需要在发送之前JSON.stringify
data parameter
。
【讨论】:
【参考方案8】:这是你的答案。 使用
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]);
);
你的 C# web 方法应该是
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string AddTo_Cart(int itemId, string quantity)
SpiritsShared.ShoppingCart.AddItem(itemId, quantity);
return "Item Added Successfully";
从任何按钮click
或任何其他html 控件event
,您可以使用参数调用javascript
方法,然后调用webmethod
以获取json
格式的值。
【讨论】:
以上是关于如何在 Asp.net C# 中调用 webmethod的主要内容,如果未能解决你的问题,请参考以下文章
将 DLL 引用添加到 C# asp.net 项目后如何调用函数
如何使用 javascript 调用 ASP.NET c# 方法