次のコードを使用して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()
には、正しく定義されていない場合に問題を引き起こす可能性のある要素がかなりあります。最も基本的な形式で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;
}
これは少し遅れますが、私はこの問題に出くわして、この種の自分の問題を解決しようとしました。その後、私はajaxの投稿にこの行が間違っていることに気付きました:
data: "{'quantity' : " + total_qty + ",'itemId':" + itemId + "}",
そのはず:
data: "{quantity : '" + total_qty + "',itemId: '" + itemId + "'}",
WebMethodと同様に:
public static string AddTo_Cart(string quantity, string itemId)
これで問題が解決しました。
それが他の誰かにも役立つことを願っています。
必要がある JSON.stringify
the data parameter
送信する前に。
ここでの1つの問題は、ajax呼び出しから文字列を渡すときに、メソッドがint値を予期することです。文字列に変更し、必要に応じてwebmethod内で解析してみてください:
[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 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);
}
}
問題は_[System.Web.Services.WebMethod]
_にあり、[WebMethod(EnableSession = false)]
を追加すると、ページのライフサイクルを取り除くことができます。デフォルトでは、ページでEnableSessionがtrueであり、ライフサイクルイベントを通じてページが有効になります。
詳細については、以下のページを参照してください http://msdn.Microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx
この質問を壊す;)
Stringized 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]
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!!!");
});