2011-07-28 2 views
1

J'ai créé un IHttpAsyncHandler que j'essaye d'appeler en utilisant AJAX, avec jQuery. L'appel réussit, mais je ne trouve pas mes paramètres sur le serveur.Post AJAX sur le site Web ASP.Net est manquant paramètres

Voici l'appel AJAX:

function deleteViewModel(typename) { 
    var data = { 
     "viewModel": typename, 
     "operation": "delete" 
    }; 

    $.ajax({ 
     type: "POST", 
     url: "<%= GetAppRoot() %>/viewModelGeneration.ashx", 
     contentType: "application/json", 
     cache: false, 
     data: JSON.stringify(data), 
     beforeSend: function (xhr, settings) { 
      $("[id$=processing]").dialog(); 
     }, 
     success: function (data) { 
      alert('Hey, I succeeded.'); 
     }, 
     error: function (xhr, status, err) { 
      alert('Play a sad trombone and frown.'); 

     }, 
     dataType: "json" 
    }); 
} 

L'appel arrive sur le serveur et est géré par mon gestionnaire, mais je ne vois pas non plus les là paramètres viewModel ou operation:

public void ProcessRequest(HttpContext context) 
{ 
    // Problem is here - no parameters! 
    var viewModelName = context.Request.Params["viewModel"]; 
    var operation = context.Request.Params["operation"]; 

    // Other stuff... 

    GenerateResponse(context.Response, jsonResp); 
} 

J'ai ouvert Fiddler ouvert pour obtenir un coup d'oeil à la demande envoyée par le client, et il me semble que les paramètres sont inclus:

POST http://localhost:4638/admin/viewModelGeneration.ashx HTTP/1.1 
Host: localhost:4638 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive 
Content-Type: application/json; charset=UTF-8 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:4638/admin/Admin/ResetViewModels.aspx 
Content-Length: 123 
Cookie: ASP.NET_SessionId=ifmof1ole4yv20jr0frqc0lk; .ASPXFORMSAUTH=836B7EEC539B1304126C156CA20A925DD4FF832E628C807A1CA9DCD00833BDFF36D73C39B9CCFE6EA15CF9FED95157A1CA5F07D588F04A8AFE68ABDBBA82FE9FF8507CB2B471340917616818334BCF0D958CB231A1CA3B9D91B05F2897C44663B5E86FC2FFDFE3C325AB66EC3124144F87B6FC8D3F6C7F92F2FEE745EA71EB333D18E35A7FFA992F8F52FEE509043236 
Pragma: no-cache 
Cache-Control: no-cache 

{"viewModel":"Rds.ViewModels.Updaters.RegionViewModelUpdater, Rds.ViewModels","operation":"delete"} 

Je ne suis pas sûr de ce qui se passe qu'ils ne rencontrent pas sur le serveur. Toute réflexion sera apprécié.

MISE À JOUR:

Quelqu'un m'a suggéré que Request.Params ne supporte que les données codées formes. Je mis à jour mon appel AJAX à cela, mais toujours pas côté serveur paramètres:

function updateViewModel(typename, operation) { 
    var parms = { 
     "viewModel": typename, 
     "operation": operation 
    }; 

    $.ajax({ 
     type: "POST", 
     url: "/admin/viewModelGeneration.ashx", 
     contentType: "application/json", 
     cache: false, 
     data: parms, 
     beforeSend: function (xhr, settings) { 
       $("[id$=processing]").dialog(); 
     }, 
     success: onSuccess, 
     error: onError 
    }); 
} 

Répondre

3

Cela fonctionne avec les données codées par des formulaires, mais pour ce faire, vous devez non seulement supprimer le dataType, mais également la propriété contentType. Avec cet appel, succès:

function updateViewModel(typename, operation) { 
    var parms = { 
     "viewModel": typename, 
     "operation": operation 
    }; 

    $.ajax({ 
     type: "POST", 
     url: "<%= GetAppRoot() %>/viewModelGeneration.ashx", 
//  contentType: "application/json", 
     cache: false, 
     data: JSON.stringify(parms), 
     beforeSend: function (xhr, settings) { 
      $("[id$=processing]").dialog(); 
     }, 
     success: function (data) { 
      alert('Hey, I succeeded.'); 
     }, 
     error: function (xhr, status, err) { 
      alert('Play a sad trombone and frown.'); 
     } 
//  dataType: "json" 
    }); 
} 
+0

C'est cool, mais vous dites "data: JSON.stringify (data)". Cela ne devrait-il pas être "data: JSON.stringify (parms)"? –

+0

Ouais, vous avez raison. Mon erreur de transcription du code de la source à ici, en essayant de simplifier autant que possible pour plus de clarté. Corrigé la question. –

0

essayer avec

data:{viewModel:'typename',operation:'delete'}, 
+0

Pas de joie. Dans Fiddler, cela donne exactement la même requête que ce que j'ai noté ci-dessus, sauf qu'il n'y a pas de parenthèses autour des paramètres. –

1

J'ai eu un problème similaire dans lequel je devais simplement déclarer

var dataString = JSON.stringify(data) 

avant de transmettre les données Chaîne avec

data: dataString, 

Donnez-lui un coup. Au moins, vous pouvez déboguer le script dans Firebug et vous assurer que dataString a été rempli avec un objet attendu.

+0

La requête interceptée par Fiddler montre les paramètres dans la charge utile - regardez la dernière ligne, qui est un objet JSON avec deux propriétés. J'ai essayé votre suggestion de toute façon, aucun effet. –

Questions connexes