web-dev-qa-db-ja.com

Asp.net C#でwebmethodを呼び出す方法

次のコードを使用して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を呼び出します。どうすれば修正できますか?

15

$.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;
}
11
JDandChips

これは少し遅れますが、私はこの問題に出くわして、この種の自分の問題を解決しようとしました。その後、私はajaxの投稿にこの行が間違っていることに気付きました:

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

そのはず:

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

WebMethodと同様に:

public static string AddTo_Cart(string quantity, string itemId)

これで問題が解決しました。

それが他の誰かにも役立つことを願っています。

8
Fred

必要がある JSON.stringify the data parameter送信する前に。

0
Karlth

ここでの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パラメーターを渡します。

0
Zaki

なぜそれが機能しないのか分かりません、私のテストではうまくいきます。しかし、ここに役立つかもしれない代替技術があります。

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);
    }
}
0
Bryan

問題は_[System.Web.Services.WebMethod]_にあり、[WebMethod(EnableSession = false)]を追加すると、ページのライフサイクルを取り除くことができます。デフォルトでは、ページでEnableSessionがtrueであり、ライフサイクルイベントを通じてページが有効になります。

詳細については、以下のページを参照してください http://msdn.Microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx

0
user3411833

この質問を壊す;)

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

2番目のステップ: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";
}

3番目のステップ:必要な場所で呼び出す

これは、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!!!");
    });
0
GoldBishop