Invio dati json con ajax a controller restituisce sempre NULL

di il
17 risposte

Invio dati json con ajax a controller restituisce sempre NULL

Salve ragazzi,
ho un problema che mi sta facendo impazzire,ho girato forum e forum nell'universo intero, ma nessuna soluzione.
Ho una semplicissima applicazione MVC con cui debbo inviare dei dati JSON ,ma ogni invio restituisce null.
L'oggetto da recuperare è questo :
public class C_USER
    {
        public string username { get; set; }

        public string password { get; set; }
    }
Il controller che deve ricevere è così strutturato:
[HttpPost]
       public JsonResult myAction(C_USER data)
        {
            return Json ("some action....");
        }
mentre la pagina che invia con AJAX è la seguente:
$('#submit').click(function () {
                var data = {
                    "data": {
                        username: "test_user",
                        password: "testpwd"
                    }
                };
                
                $.ajax({
                    url: "@Url.Action("myAction")",
                    type: "POST",
                    data: JSON.stringify(data),
                    dataType: "json",
                    traditional: true,
                    contentType: "application/json",
                    success: function (d) {
                        alert('ok');

                    },
                    error: function () {
                        alert('errore');
                    }

                }
                );

            });
ho cambiato il content type e ho messo l'intestazione data nel post JSON, ma nulla da fare!
grazie del vostro aiuto

17 Risposte

  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Posta il codice dell'azione del Controller che restituisce il dato, così possiamo esaminarla.

    Oltre a questo, hai provato ad attivare il debugger e fermarti sul codice del Controller per vedere cosa succede e se l'azione viene effettivamente invocata?

    Ciao!
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Ciao Alka,

    il codice dell'azione del controller lo ho già postato, è molto semplice :
    [HttpPost]
           public JsonResult myAction(C_USER data)
            {
                return Json ("some action....");
            }
    quando faccio il debug da Visual Studio e verifico il parametro data mi dà per l'appunto un NULL.
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Ho anche debuggato dal browser e i dati inviati mi sembrano corretti
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    run4ever ha scritto:


    quando faccio il debug da Visual Studio e verifico il parametro data mi dà per l'appunto un NULL.
    Quindi non è la tua API che restituisce null, bensì è il parametro di ingresso che vale null.

    Visto che si tratta di una POST e che quindi i valori dovrebbero essere nel corpo della richiesta, hai provato a mettere l'attributo [FromBody] nel parametro di tipo C_USER?
    
    public JsonResult myAction([FromBody] C_USER data)
    {
      return Json ("some action....");
    }
    
    Ho anche dei dubbi sul valore che ritorni: dovendo essere convertito in JSON, il valore passato come parametro dovrebbe essere riconducibile a una struttura "chiave/valore" e non costituire un valore singolo, ma è possibile che il serializzatore JSON sia abbastanza "intelligente" da mettere un qualificatore o comunque forzare la restituzione di quel valore aggiungendo quello che manca per essere JSON valido.

    Ciao!
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Purtroppo non va neanche mettendo il [fromBody] ,non capisco come possa non funzionare con dei dati JSON così semplici
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    run4ever ha scritto:


    Purtroppo non va neanche mettendo il [fromBody] ,non capisco come possa non funzionare con dei dati JSON così semplici
    Ma hai verificato quali sono i dati che vengono effettivamente inviati usando i Developer Tools del browser?
    Se sì, quali sono?

    Siamo sicuri che la chiamata vada effettivamente a buon fine?

    Fai qualche verifica su tutto il "giro" dalla chiamata alla risposta verificando che in ogni punto avvenga esattamente ciò che ci si aspetta.

    Io farei anche qualche semplificazione, ad esempio
    
    var data = {
                        "data": {
                            username: "test_user",
                            password: "testpwd"
                        }
                    };
    
    potrebbe diventare così:
    
    var data = {
      username: "test_user",
      password: "testpwd"
    };
    
    Inoltre, eviterei di chiamare JSON.stringify() poiché JQuery in genere si occupa di tutto.

    Ciao!
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Il codice ajax restituisce un Success come esito, quindi non ci sono errori di script.
    Lo strumento che ho utilizzato su Firefox premendo F12 mi dice che dopo il Success il campo data ha i valori che mi aspetto, utilizzo il DEBUGGER impostando i punti di interruzione sulla chiamata ajax e la RETE per verificare l'Header HTTP inviato.
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Non si è capito se hai seguito gli ultimi suggerimenti di alka e l'esito della prova
    e neanche se , a giudicare dal nome , il pulsante submit fa capo ad una form di login
    di cui scatena il submit , nel qual caso, IMHO, potrebbe essere utile riportare
    anche il codice html oltre al javascript
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    run4ever ha scritto:


    Il codice ajax restituisce un Success come esito, quindi non ci sono errori di script.
    Lo strumento che ho utilizzato su Firefox premendo F12 mi dice che dopo il Success il campo data ha i valori che mi aspetto, utilizzo il DEBUGGER impostando i punti di interruzione sulla chiamata ajax e la RETE per verificare l'Header HTTP inviato.
    Cosa c'entra l'header HTTP? Occorre vedere il corpo della richiesta, non l'intestazione.
    Riporta un copia/incolla o uno screenshot, così possiamo vederlo anche noi.

    Il fatto che tu veda un Success significa che è stata ricevuta una risposta, ma non è detto che sia quella attesa, né che i parametri inviati siano corretti, tant'è che nel codice non fai uso degli argomenti che vengono inviati con il POST, a meno che tu non abbia omesso del codice.

    Ciao!
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Hai ragione, perdonatemi ma sono ai primi passi di JSON/HTTP, ammetto di essere una capra in questo.
    Effettivamente vedendo la risposta i dati sono "attaccati" e non separati come struttura.Questo il link del mio screenshot.
    https://drive.google.com/file/d/1ofZ95LVAJR6_0nZPcj5PHY49LiDAk8Zs/view?usp=sharing
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Sembra sia una richiesta inviata con content-type= application/x-www-form-urlencoded
    ( ... come se l'avesse inviata una form) invece che application/json;

    però il ModelBinding dovrebbe funzionare ugualmente che io sappia

    riesci a vederlo il content-type nella richiesta ?

    P.S.
    prova a togliere quel traditional=true nella richiesta ajax

    .... secondo me non sarebbe male vedere tutta la pagina HTML compreso
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Il content type della richiesta è corretto,ovvero application/json, togliendo traditional=true non cambia nulla.
    qua il link del codice html della pagina :https://drive.google.com/file/d/16SDH3qCB35RLUUNXXgqm_6sAeLRDjA4y/view?usp=sharing
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    Io non riesco a vedere il codice; ma non puoi postarlo qui sul forum ( tra i tag code) ?
  • Re: Invio dati json con ajax a controller restituisce sempre NULL

    È un pò lungo ma ci provo:
    
    @model GEST_AZPASSERINI_WEB.Models.ViewModels.VM_SCHEDE_LAVORAZIONI_H
    @{
    
        ViewData["Title"] = "LAV_Insert";
        // ViewData["ID_LAVORAZIONE_GRP"] = Model.ID_GRP_LAVORAZIONE;
    }
    
    <h1>Scheda Lavorazioni</h1>
    <form method="post">
        <div class="row">
            <div class="col-md-4 mb-4">
                <div class="form-group">
                    <h5><label for="cbo_tipoOperazione">Tipo Lavorazione</label></h5>
                    <select asp-for="TIPO_OPERAZIONE_Selected.ID_TIPO_OPERAZIONE" class="form-control" id="cbo_Nomelavorazione">
                        @for (int idx = 0; idx < Model.TIPI_OPERAZIONE.Count(); idx++)
                        {
                            <option value="@Model.TIPI_OPERAZIONE[idx].ID_TIPO_OPERAZIONE">@Model.TIPI_OPERAZIONE[idx].DESCRIZIONE</option>
    
                        }
                    </select>
                </div>
            </div>
            <div class="col-md-4 mb-4">
                <div class="form-group">
                    <h5><label for="cbo_Nomelavorazione">Nome Lavorazione</label></h5>
                    <select asp-for="NOME_LAVORAZIONE_Selected.ID_LAVORAZIONE_NOME" class="form-control" id="cbo_Nomelavorazione">
                        @for (int idx = 0; idx < Model.NOMI_LAVORAZIONE.Count(); idx++)
                        {
                            <option value="@Model.NOMI_LAVORAZIONE[idx].ID_LAVORAZIONE_NOME">@Model.NOMI_LAVORAZIONE[idx].DESCRIZIONE</option>
    
                        }
                    </select>
                </div>
    
    
            </div>
            <div class="col-md-2 mb-2">
                <div class="form-group">
                    <h5><label for="cbo_Lav_CntTerzi">Lav. Conto Terzi</label></h5>
                    <select class="form-control" id="cbo_Lav_CntTerzi">
                        <option value="true">SI</option>
                        <option value="false">NO</option>
                    </select>
                </div>
    
    
            </div>
    
    
    
            <div class="col-md-4 mb-4">
    
                <input type="button" value="Aggiungi Step Lavorazione"  data-toggle="modal" data-target="#loginModal" class="btn btn-primary bg-success" />
    
            </div>
    
    
    
    
        </div>
    
        <div class="row">
            <div class="col-md-8  mb-8">
                <table id="table_lav">
                    <thead>
                        <tr><th>DATA LAVORAZIONE</th><th>ID_SOGGETTO</th><th>SOGGETTO</th><th>NUMERO DOC</th><th>ID TIPO DOC</th><th>TIPO DOCUMENTO</th></tr>
                    </thead>
                    <tbody>
    
    
                    </tbody>
                    
                </table>
    
    
            </div>
    
        </div> 
    
        <div class="row">
            <div class="col-md-8  mb-8">
                <input type="button" value="Conferma Lavorazione"  id="submit" class="btn btn-primary bg-success" />
    
            </div>
        </div>
    
    
    
    </form>
    
    
    <div class="row">
        <div class="col-md-6">
            <div class="modal fade bs-example-modal-sm" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
                <div class="modal-dialog modal-md">
                    <div class="modal-content">
                        <h4 class="modal-header">Inserisci trasformazione</h4>
                        <div class="modal-body">
                            <div class="container">
                                <div class="col-md-10">
                                    <div class="form-group">
                                       
                                        <!-- DATA OPERAZIONE -->
                                        <h5><label for="fld_DataOperazione">Data Operazione</label></h5>
                                        <input type="date" class="form-control" id="fld_DataOperazione" required>
    
                                        <!--SOGGETTO -->
                                        <h5><label for="cbo_Soggetto">Soggetto</label></h5>
                                        <select class="form-control" id="cbo_Soggetto">
                                            @for (int idx = 0; idx < Model.SOGGETTI.Count(); idx++)
                                            {
                                                <option value="@Model.SOGGETTI[idx].ID_FORNITORE">@Model.SOGGETTI[idx].RAGIONE_SOCIALE</option>
    
                                                }
                                        </select>
    
                                        <!-- NUMERO DOC RIFERIMENTO -->
                                        <h5><label for="fld_NumDoc">Numero doc. riferimento</label></h5>
                                        <input type="text" class="form-control" id="fld_NumDoc">
    
                                        <!-- TIPO DOCUMENTO RIFERIMENTO -->
                                        <h5><label for="cbo_TipoDoc">Tipo documento</label></h5>
                                        <select class="form-control" id="cbo_TipoDoc">
                                            @for (int idx = 0; idx < Model.TIPI_DOC_REF.Count(); idx++)
                                            {
                                                <option value="@Model.TIPI_DOC_REF[idx].ID_TIPO_DOC_REF">@Model.TIPI_DOC_REF[idx].DESCRIZIONE</option>
    
                                            }
                                        </select>
    
    
    
                                        
                                    </div>
    
    
                                </div>
    
                            </div>
                        </div>
    
                        <div class="modal-footer">
                            <a id="btnAdd" class="btn btn-primary bg-success" >
    
                                <span class="glyphicon glyphicon-plus"></span> Conferma
                            </a>
                            <a id="BtnClose" class="btn btn-danger" data-dismiss="modal">
                                <span class="glyphicon glyphicon-off"></span> Esci
                            </a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    
    @section Scripts {
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script>
            $(document).ready(function () {
    
    
                var dati_lavorazioni = [];
                var cntNumber = 0;
    
                //aggiunta record Lavorazione a tabella
                $('#btnAdd').click(function () {
    
                    //accodo a array
                    dati_lavorazioni.push({
                        DATA_LAVORAZIONE: $("#fld_DataOperazione").val(),
                        ID_SOGGETTO: $("#cbo_Soggetto :selected").val(),
                        SOGGETTO: $("#cbo_Soggetto :selected").text(),
                        NUM_DOC_REF: $("#fld_NumDoc").val(),
                        ID_TIPO_DOC_REF: $("#cbo_TipoDoc :selected").val(),
                        TIPO_DOC_REF: $("#cbo_TipoDoc :selected").text()
                    });
    
                    AddItemHTMLTable(); //aggiungo al markup HTML
                    cntNumber += 1;
                });
    
    
                //aggiunge il record selezionato al markup HTML
                function AddItemHTMLTable() {
                    row = "<tr><td>" +
                        dati_lavorazioni[cntNumber].DATA_LAVORAZIONE +
                        "</td><td> " +
                        dati_lavorazioni[cntNumber].ID_SOGGETTO +
                        "</td><td> " +
                        dati_lavorazioni[cntNumber].SOGGETTO +
                        "</td><td> " +
                        dati_lavorazioni[cntNumber].NUM_DOC_REF +
                        "</td><td> " +
                        dati_lavorazioni[cntNumber].ID_TIPO_DOC_REF +
                        "</td><td> " +
                        dati_lavorazioni[cntNumber].TIPO_DOC_REF +
                        "</td><tr> " ;
    
    
    
                    tableBody = $("#table_lav");
                    tableBody.append(row);
    
                    ClearFieldsModalForm();
    
                }
    
                function ClearFieldsModalForm() {
                    $('#fld_DataOperazione').val('');
                    $('#fld_NumDoc').val('');
                }
    
    
                $('#submit').click(function () {
                    var data = { username: "test", password: "pwd" };
                    
                    $.ajax({
                        url: "@Url.Action("myAction")",
                        type: "POST",
                        data: data,
                        dataType: "json",
                        
                        contentType: "application/json",
                        success: function (data) {
                            alert('ok');
                            console.log('data: ' + data);
    
                        },
                        error: function () {
                            alert('errore');
                        }
    
                    }
                    );
    
                });
    
    
    
            });
    
        </script>
    
    
    
    
    }
    
    
Devi accedere o registrarti per scrivere nel forum
17 risposte