web-dev-qa-db-ja.com

jQuery AJAX ASP.Netページにデータを投稿するための呼び出し(GetではなくPOST)

次のjQuery AJAX ASP.Netページの呼び出しがあります。

             $.ajax({
                async: true,
                type: "POST",
                url: "DocSummaryDataAsync.aspx", //"DocSummary.aspx/GetSummaryByProgramCount",
                contentType: "application/json; charset=utf-8",
                data: kendo.stringify({ vendorId: supplierId, businessUnit: busUnit, productSegmentId: prodSegmentId, programId: progId, productManagerId: prodManagerId, companyIds: compIds, expired: exp.toString(), requestType: 'TotalCount' }),
                success: function (msg) {
                    // alert('in success of getcount');

                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    // alert('in failure of getcount');


                }
            });

リクエストオブジェクト、ポストされたデータから取得しようとすると、表示されません。私のaspxページコードは次のとおりです。投稿された各データをJson形式でページに送信していますが、ページのコードビハインドに表示されません。 不足しているjQuery ajax呼び出しに追加の設定はありますか?

   protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "application/json";

        string requestType = Request.Params["requestType"];


        //populate variables from posted data
        string vendorId = Request.Params["vendorId"];
        string businessUnit = Request.Params["businessUnit"];
        string productSegmentId = Request.Params["productSegmentId"];
        string commitmentProgramId = Request.Params["programId"];
        string productManagerId = Request.Params["productManagerId"];
        string companyIds = Request.Params["companyIds"];
        string expired = Request.Params["expired"];
     }

PDATE 1: Stephenの答えは、これに対する最善のアプローチ、特にProcessRequestを行うアプローチです。ただし、Request ["vendorId"]などの通常の従来の方法でデータをASP.Netに投稿できるようにする小さなトリックを見つけました。jQueryajaxリクエストからのデータの投稿を有効にするには、単に次の2点がjQuery ajax呼び出しに適用されていることを確認してください。

  1. content-typeはjQuery ajax呼び出しから除外する必要がありますまたは、含める場合は設定しない "application/json; charset = utf- 8」が「application/x-www-form-urlencoded; charset = UTF-8」に。私の理解によると、コンテンツタイプは、ASP.Netページに送信されるデータのタイプを伝えるものであり、ページに期待されるデータのタイプではありません。
  2. JQuery ajaxのデータ部分引用符で囲まれたデータ名を使用しないでください。したがって、データ:{"venorId": "AD231"、 "businessUnit": "123"}はデータ:{vendorId: "AD231"、businessUnit: "123"}に置き換える必要があります。この例では、データ名はvendorIdとbusinessUnitであり、Request ["vendorId"]やRequest ["businessUnit"]などの通常のASP.Net構文を使用してASP.Netコードビハインドでアクセスできます。
20
Sunil

オプション1。サーバー側のコードを同じにしてください

最初にkendo.stringifyを削除します。次に、contentTypeを削除するか、次のように変更します...

"application/x-www-form-urlencoded; charset=utf-8" 

...または$ .ajax呼び出しをこれに変更します。

$.post('DocSummaryDataAsync.aspx', { vendorId: supplierId, businessUnit: busUnit, productSegmentId: prodSegmentId, programId: progId, productManagerId: prodManagerId, companyIds: compIds, expired: exp.toString(), requestType: 'TotalCount' }, function (data) { });

オプション2.POSTをGETに変更

このような

$.ajax({
async: true,
type: "GET",
etc.

これにより、QueryStringを介してデータが渡されます。 kendo.stringify呼び出しを削除すると、次のようなすべての値にアクセスできます。

string vendorId = Request.QueryString[0];
string businessUnit = Request.QueryString[1];
etc.

オプション3。元の$ .ajax呼び出しを使用します

元の$ .ajaxを使用する場合、以下が適用されます。

Request.Paramsは、「QueryString、Form、Cookie、およびServerVariablesアイテムの組み合わせコレクション」を取得します。 - このリンク

あなたはそれらのどれとも働いていません。代わりに、Request.InputStreamにアクセスする必要があります。

その方法は次のとおりです。

リクエストされたJSONオブジェクトにマッピングするクラスをサーバー側で作成します。

public class MyClass
{
    // The type (int or string) should probably correspond to the JSON
    public int vendorId { get; set; }
    public string businessUnit { get; set; }
    public string productSegmentId { get; set; }
    public string programId { get; set; }
    public string productManagerId { get; set; }
    public string companyIds { get; set; }
    public string expired { get; set; }
    public string requestType { get; set; }
}

Request.InputStreamをそのタイプに変換すると、それを使用できます。

public void ProcessRequest()
{
    System.IO.Stream body = Request.InputStream;
    System.Text.Encoding encoding = Request.ContentEncoding;
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
    string json = reader.ReadToEnd();
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    MyClass myclass = (MyClass)serializer.Deserialize(json, typeof(MyClass));
    int vendorId = myclass.vendorId;
    string requestType = myclass.requestType;
    // etc...
}

protected void Page_Load(object sender, EventArgs e)
{
    ProcessRequest();
}
32