2009-12-03 4 views
13

Il doit y avoir quelque chose qui me manque. J'ai essayé d'utiliser $ .ajax() et $ .post() pour envoyer une chaîne à mon contrôleur ASP.NET MVC, et tant que le contrôleur est atteint, la chaîne est nulle quand elle arrive. Voici donc la méthode post j'ai essayé:

$.post("/Journal/SaveEntry", JSONstring); 

Et voici la méthode ajax j'ai essayé:

$.ajax({ 
    url: "/Journal/SaveEntry", 
    type: "POST", 
    data: JSONstring 
}); 

Voici mon contrôleur:

public void SaveEntry(string data) 
{ 
    string somethingElse = data; 
} 

Pour fond, je sérialisé une Objet JSON utilisant JSON.stringify(), et cela a réussi. J'essaye de l'envoyer à mon contrôleur pour le désérialiser(). Mais comme je l'ai dit, la chaîne arrive comme nulle à chaque fois. Des idées?

Merci beaucoup.

MISE À JOUR: Il m'a été répondu que mon problème était que je n'utilisais pas de paire clé/valeur comme paramètre de $ .post(). J'ai donc essayé, mais la chaîne arrive toujours au contrôleur comme nulle:

$.post("/Journal/SaveEntry", { "jsonData": JSONstring }); 
+0

Pouvez-vous lancer un firebug? qu'est-ce qui est actuellement envoyé comme requête au serveur dans votre console firebug? – prodigitalson

Répondre

19

Répondu. Je n'avais pas les noms de variables correctement définis après ma première mise à jour.J'ai changé le nom de la variable dans le contrôleur à jsonData, donc mon nouvel en-tête de contrôleur ressemble à:

public void SaveEntry(string jsonData) 

et mon action de poste à JS ressemble:

$.post("/Journal/SaveEntry", { jsonData: JSONstring }); 

JSONstring est un « de chaîne de caractères » (ou "sérialisé") objet JSON que j'ai sérialisé en utilisant le JSON plugin offert à json.org. Alors:

JSONstring = JSON.stringify(journalEntry); // journalEntry is my JSON object 

Ainsi, les noms de variables dans le .post de $, et la méthode du contrôleur doivent être le même nom, ou rien ne fonctionnera. Bon à savoir. Merci pour les réponses.

5

Réponse finale:

Il semble que les noms de variables ne sont pas la queue dans son poste comme je l'ai suggéré dans un commentaires après le tri des problèmes de mise en forme des données (en supposant que est également un problème.

en fait, assurez-vous que vous êtes en utilisant le nom de la clé droite que votre code de Serverside recherche ainsi que par L'exemple d'Olek - ie. Si votre code est en recherchant les données variables, alors vous devez utiliser les données comme clé pour . - prodigitalson Il ya 6 heures

@prodigitalson, qui a fonctionné. Les noms des variables n'étaient pas alignés. Will vous postez une deuxième réponse, donc je peux l'accepter? Merci. - il y a 6 heures Mega Matt

Il a donc besoin d'utiliser une paire de clés/valeur, et assurez-vous qu'il saisissait la variable de droit à la demande du côté du serveur.


l'argument de données doit être une valeur clé paire

$.post("/Journal/SaveEntry", {"JSONString": JSONstring}); 
+0

@prodigitalson, je suis d'accord que c'est une option, mais la documentation à http: // docs.jquery.com/Ajax/jQuery.post dit qu'il accepte les paires clé/valeur (Map) ou une chaîne. Je suis donc un peu confus ... –

+1

@Mega Matt: Si vous utilisez une chaîne je suppose qu'il doit être dans le format de chaîne de requête standard ie. JSONString = mySerializedDataStruct & var2 = myothervar. Afin de le récupérer côté serveur, la variable peut avoir un nom. – prodigitalson

+0

@prodigitalson, essayé en utilisant la méthode que vous avez répondu ci-dessus sans succès. Voir ma modification ci-dessus. –

1

Il semble dataType est manquée. Vous pouvez également définir contentType juste au cas où. Voulez-vous essayer cette version?

$.ajax({ 
    url: '/Journal/SaveEntry', 
    type: 'POST', 
    data: JSONstring, 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8' 
}); 

Cheers.

+0

@Oleksandr Bernatskyi, mais le type de données devrait-il être 'json' quand j'envoie une chaîne? Ce n'est pas un objet JSON, simplement une chaîne ... –

+1

Oh, je vois. @prodigitalson a dit la bonne chose en fait - chaque variable devrait avoir un nom. Peut-être que cela va fonctionner? $ .post ("/ Journal/SaveEntry", {"data": JSONstring}); –

+1

En fait, assurez-vous que vous utilisez le bon nom de clé que votre code serveur recherche ainsi que par l'exemple d'Olek - ie. Si votre code recherche les données variables, vous devez utiliser les données comme clé. – prodigitalson

1

Merci pour la réponse ceci résolvent mon cauchemar.

Ma grille

.. 
.Selectable() 
.ClientEvents(events => events.OnRowSelected("onRowSelected")) 
.Render(); 

<script type="text/javascript"> 
function onRowSelected(e) { 
     id = e.row.cells[0].innerHTML; 
     $.post("/<b>MyController</b>/GridSelectionCommand", { "id": id}); 
    } 
</script> 

mon contrôleur

public ActionResult GridSelectionCommand(string id) 
{ 
    //Here i do what ever i need to do 
} 
0

La voie est ici.

Si vous souhaitez spécifier

dataType: 'json'

utiliser ensuite

$('#ddlIssueType').change(function() { 


      var dataResponse = { itemTypeId: $('#ddlItemType').val(), transactionType: this.value }; 

      $.ajax({ 
       type: 'POST', 
       url: '@Url.Action("StoreLocationList", "../InventoryDailyTransaction")', 
       data: { 'itemTypeId': $('#ddlItemType').val(), 'transactionType': this.value }, 
       dataType: 'json', 
       cache: false, 
       success: function (data) { 
        $('#ddlStoreLocation').get(0).options.length = 0; 
        $('#ddlStoreLocation').get(0).options[0] = new Option('--Select--', ''); 

        $.map(data, function (item) { 
         $('#ddlStoreLocation').get(0).options[$('#ddlStoreLocation').get(0).options.length] = new Option(item.Display, item.Value); 
        }); 
       }, 
       error: function() { 
        alert("Connection Failed. Please Try Again"); 
       } 
      }); 

Si vous ne spécifiez pas

dataType: « JSON '

Ensuite, utilisez

$('#ddlItemType').change(function() { 

     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("IssueTypeList", "SalesDept")', 
      data: { itemTypeId: this.value }, 
      cache: false, 
      success: function (data) { 
       $('#ddlIssueType').get(0).options.length = 0; 
       $('#ddlIssueType').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlIssueType').get(0).options[$('#ddlIssueType').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again"); 
      } 
     }); 

Si vous souhaitez spécifier

dataType: 'json' et contentType: « application/json; charset = utf-8'

Utilisez ensuite

$.ajax({ 
      type: 'POST', 
      url: '@Url.Action("LoadAvailableSerialForItem", "../InventoryDailyTransaction")', 
      data: "{'itemCode':'" + itemCode + "','storeLocation':'" + storeLocation + "'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
      cache: false, 
      success: function (data) { 

       $('#ddlAvailAbleItemSerials').get(0).options.length = 0; 
       $('#ddlAvailAbleItemSerials').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlAvailAbleItemSerials').get(0).options[$('#ddlAvailAbleItemSerials').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again."); 
      } 
     }); 
0

Si vous ne pouvez toujours pas faire fonctionner, essayer vérifier la page URL que vous appelez le $.post de.

Dans mon cas, j'appelais cette méthode de localhost:61965/Example et mon code est:

$.post('Api/Example/New', { jsonData: jsonData }); 

Firefox a envoyé cette demande à localhost:61965/Example/Api/Example/New, ce qui est la raison pour laquelle ma demande ne fonctionne pas. En réponse à votre mise à jour ...

Questions connexes