web-dev-qa-db-fra.com

jQuery AJAX Appel pour publier des données sur la page ASP.Net (pas Get mais POST)

J'ai le jQuery suivant AJAX appel à une page 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');


                }
            });

Lorsque j'essaie de récupérer à partir de l'objet Request, les données publiées, elles ne s'affichent pas. Mon code de page aspx est comme ci-dessous. J'envoie chacune des données publiées au format Json à la page, mais elles n'apparaissent pas dans le code-derrière de la page. Y a-t-il un paramètre supplémentaire dans l'appel ajax jQuery qui me manque?

   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"];
     }

MISE À JOUR 1: La réponse de Stephen est la meilleure approche pour cela, en particulier l'approche qui fait ProcessRequest. Cependant, j'ai trouvé une petite astuce qui permettra de publier des données sur ASP.Net de la manière traditionnelle habituelle, c'est-à-dire comme Request ["vendorId"] etc. assurez-vous que les 2 points suivants sont appliqués à votre appel ajQuery jQuery:

  1. Le type de contenu doit être exclu de votre appel ajQuery jQuery Ou si vous voulez l'inclure alors il doit ne pas être défini sur "application/json; charset = utf- 8 "mais vers" application/x-www-form-urlencoded; charset = UTF-8 ". Type de contenu, selon ma compréhension, indique à la page ASP.Net le type de données qui est envoyé et non le type de données attendu de la page.
  2. La partie données de jQuery ajax les noms de données ne doivent pas être placés entre guillemets. Ainsi, les données: {"venorId": "AD231", "businessUnit": "123"} doivent être remplacées par les données: {vendorId: "AD231", businessUnit: "123"}. Dans cet exemple, les noms de données sont vendorId et businessUnit, qui sont accessibles dans votre code-behind ASP.Net en utilisant la syntaxe ASP.Net habituelle comme Request ["vendorId"] et Request ["businessUnit"].
20
Sunil

Option 1. Gardez le même code côté serveur

Retirez d'abord le kendo.stringify. Supprimez ensuite le contentType ou changez-le en ...

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

... ou changez votre appel $ .ajax en ceci:

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

Option 2. Modifiez le POST en GET

Comme ça

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

Cela transmettra vos données via QueryString. Si vous supprimez l'appel kendo.stringify, vous accéderiez à toutes les valeurs comme ceci:

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

Option 3. Utilisez votre appel $ .ajax d'origine

Si vous utilisez votre $ .ajax d'origine, alors ce qui suit s'applique:

Request.Params obtient une "collection combinée d'éléments QueryString, Form, Cookies et ServerVariables". - ce lien

Vous ne travaillez avec aucun d'entre eux. Au lieu de cela, vous devez accéder à Request.InputStream.

Voici comment procéder:

Créez une classe côté serveur qui correspond à l'objet JSON demandé, par exemple.

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

Convertissez Request.InputStream dans ce type, puis vous pouvez l'utiliser.

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
Stephen Oberauer