2009-12-03 16 views
13

Deve esserci qualcosa che mi manca. Ho provato a utilizzare $ .ajax() e $ .post() per inviare una stringa al mio controller ASP.NET MVC, e mentre viene raggiunto il controller, la stringa è nulla quando arriva lì. Così qui è il metodo post ho provato:

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

E qui è il metodo ajax ho provato:

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

Qui è il mio controller:

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

per lo sfondo, ho serializzato un Oggetto JSON che utilizza JSON.stringify() e questo ha avuto successo. Sto provando a inviarlo al mio controller per deserializzare() it. Ma come ho detto, la stringa sta arrivando come null ogni volta. Qualche idea?

Grazie mille.

UPDATE: Si è risposto che il mio problema era che non stavo usando una coppia chiave/valore come parametro per $ .post(). Così ho provato a farlo, ma la stringa ancora arrivato al controller come nulla:

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

in risposta al vostro aggiornamento ... Potete spegnerlo? cosa viene effettivamente inviato come richiesta al server nella tua console firebug? – prodigitalson

risposta

19

Risposta. Non avevo i nomi delle variabili impostati correttamente dopo il mio primo aggiornamento.Ho cambiato il nome della variabile nel controller per jsonData, quindi la mia nuova intestazione controller appare come:

public void SaveEntry(string jsonData) 

e la mia azione posta in JS assomiglia:

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

JSONstring è un "stringata" (o oggetto "serializzato") JSON che ho serializzato utilizzando lo JSON plugin offerto su json.org. Quindi:

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

Così i nomi delle variabili nel $ .post, e nel metodo di controllo devono essere lo stesso nome, o niente funzionerà. Buono a sapersi. Grazie per le risposte.

5

risposta definitiva:

Sembra che i nomi delle variabili non sono state in fila nel suo post come ho suggerito in un lasciare un commento, dopo la cernita i problemi di formattazione dei dati (supponendo che era anche un problema.

in realtà, assicurarsi che state usando il giusto nome della chiave che il codice lato server sta cercando così come per Esempio di Olek - es. se il tuo codice è alla ricerca dei dati variabili, allora devi usare i dati come chiave nel tuo . - prodigitalson 6 ore fa

@prodigitalson, che ha funzionato. I nomi delle variabili non si stavano allineando. Sarà pubblichi una seconda risposta così posso accettarlo? Grazie. - Mega Matt 6 ore fa

Così ha bisogno di usare una coppia chiave/valore, e assicurarsi che stava afferrando la variabile destro dalla richiesta sul lato server.


l'argomento dei dati deve essere il valore della coppia di chiavi

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

@prodigitalson, sono d'accordo che questa è una opzione, ma la documentazione su http: // docs.jquery.com/Ajax/jQuery.post dice che accetterà coppie chiave/valore (Mappa) o una stringa. Quindi sono rimasto un po 'confuso ... –

+1

@Mega Matt: Se si utilizza una stringa, suppongo che debba essere in formato stringa di query standard, ad es. JSONString = mySerializedDataStruct & var2 = myothervar. Per recuperarlo sul lato server, la variabile deve avere un nome. – prodigitalson

+0

@prodigitalson, provato con il metodo che hai risposto sopra senza successo. Vedi la mia modifica sopra. –

1

Sembra dataType è mancato. È anche possibile impostare contentType per ogni evenienza. Vuoi provare questa versione?

Cheers.

+0

@Oleksandr Bernatskyi, ma il dataType dovrebbe essere "json" quando sto inviando una stringa? Questo non è un oggetto JSON, semplicemente una stringa ... –

+1

Oh, capisco. @prodigitalson ha detto la cosa giusta in realtà - ogni variabile dovrebbe avere un nome. Forse funzionerà? $ .post ("/ Journal/SaveEntry", {"data": JSONstring}); –

+1

In realtà, assicurati di utilizzare il nome giusto per la chiave che il tuo codice serveride sta cercando, come per l'esempio di Olek - es. se il tuo codice cerca i dati variabili, allora devi usare i dati come chiave. – prodigitalson

1

Grazie per la risposta questo risolve il mio incubo.

La mia griglia

.. 
.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> 

mio controller

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

La Via è qui.

Se si desidera specificare

dataType: 'json'

Quindi utilizzare,

$('#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"); 
       } 
      }); 

Se non si specifica

dataType: 'json '

Quindi utilizzare

$('#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"); 
      } 
     }); 

Se si desidera specificare

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

quindi utilizzare

$.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

Se ancora non è possibile farlo funzionare, provare controllando l'URL della pagina si sta chiamando il $.post da.

Nel mio caso mi stava chiamando questo metodo da localhost:61965/Example e il mio codice era:

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

Firefox ha inviato questa richiesta alla localhost:61965/Example/Api/Example/New, motivo per cui la mia richiesta non ha funzionato.

Problemi correlati