2013-06-18 7 views
5

Sto tentando di utilizzare jQuery per attivare una chiamata Ajax dopo aver fatto clic su un determinato pulsante. Ho letto diversi esempi della sintassi e dei problemi che si possono incontrare, ma non sono riuscito a trovare una soluzione funzionante per la mia causa. Ecco il codice.jQuery Ajax non riesce a chiamare su MVC 4 Metodo di controllo

Metodo di controllo: (HomeController.cs)

[HttpPost] 
    public JsonResult ChangeCompany(string companyCode) 
    { 
     return Json(new { result = companyCode }, JsonRequestBehavior.AllowGet); 
    } 

codice jQuery:

function changeCompany(company) { 
    $.ajax({ 
     url: '@Url.Action("ChangeCompany", "Home")', 
     type: 'POST', 
     data: JSON.stringify({ companyCode: company }), 

     success: function (data) { 
      alert("Company: " + data); 
     }, 
     error: function (req, status, error) { 
      alert("R: " + req + " S: " + status + " E: " + error); 
     } 
    }); 
} 

E, infine, chiamo questa funzione con:

$('.companyButton').click(function() { 
    compCode = $(this).text(); 
    debug("Click event --> " + $(this).text()); 
    changeCompany(compCode); 
}); 

Il mio messaggio di debug viene visualizzato correttamente e la chiamata Ajax fallisce costantemente con il seguente avviso: R: [object Object] S: error E: Not Found

Non sono del tutto sicuro di cosa farne.

So che ci sono diverse domande su questo argomento, ma nessuno di loro sembra risolvere il mio problema e onestamente non sono sicuro di cosa c'è che non va con questi blocchi di codice. Qualsiasi intuizione sarebbe apprezzata.

MODIFICA: Nel caso valga la pena notare, questo è per un dispositivo mobile. Test su Windows 8 Phone Emulator (Internet Explorer), insieme a jQuery Mobile. Non sono sicuro se che colpisce l'Ajax a tutti

EDIT 2: Dopo aver dato un'occhiata alla chiamata di rete grezzo, sembra che 'Url.Action("ChangeCompany", "Home")' non viene convertito nel URL corretto ed è invece essere chiamato direttamente come se fosse URL cruda testo. È dovuto a un jQuery obsoleto o ad altri fattori?

+0

Come si presenta il tuo metodo di azione Controller? Inoltre, guarda la chiamata di rete grezza nei tuoi strumenti di sviluppo del browser e vedi esattamente qual è la chiamata - questo dovrebbe aiutare a risolvere i problemi. –

+0

Penso che sia un errore lato server. Puoi controllare la sezione Rete della barra degli strumenti Dev di Chrome quando fai clic sulla richiesta per visualizzare la risposta nella scheda Anteprima. –

+0

Se guardi la sorgente nel tuo browser, l'url ha un bell'aspetto? E se imposti un 'debugger;' all'interno della funzione di errore, dai un'occhiata più da vicino ai parametri. –

risposta

6

Ok con il tuo EDIT2 sembra che tu stia usando url: '@Url.Action("ChangeCompany", "Home")', in un file JavaScript separato. puoi solo scrivere il codice del rasoio all'interno del file .cshtml e non funziona nei file .js

+0

Ah, questo ha senso. Non sono sicuro del motivo per cui pensavo di poterlo usare al di fuori della vista. – DrBowe

+0

È andato avanti e ha codificato l'URL nella chiamata Ajax e ora funziona bene, grazie per la cattura! – DrBowe

+0

puoi creare una variabile in .cshtml con l'url e accedervi nel file .js –

1

Mancano alcuni parametri importanti nella chiamata AJAX. Cambia la tua chiamata AJAX come di seguito:

function changeCompany(company) { 
    $.ajax({ 
       url: '@Url.Action("ChangeCompany", "Home")', 
       type: 'POST', 
       data: JSON.stringify({ companyCode: company }), 
       success: function (data) { 
         alert("Company: " + data); 
         }, 
      error: function (req, status, error) { 
         alert("R: " + req + " S: " + status + " E: " + error); 
         } 
      });} 

È quindi possibile annotare il metodo di controller con [HttpPost] attributo come di seguito;

[HttpPost] 
public JsonResult ChangeCompany(string companyCode) 
{ 
    return Json(new { result = companyCode }, JsonRequestBehavior.AllowGet); 
} 
+0

Ho fatto quanto segue e ho ricevuto lo stesso avviso di errore. Incerto su quale sia il problema. – DrBowe

0

Si noti che l'azione non restituisce companyCode direttamente. Stai assegnandolo a JSON result proprietà quindi Nella funzione successo di provocare è necessario disporre di visualizzare:

success: function (data) 
    { 
    alert("Company: " + data.result); 
    } 

anche questo: E: Not Found mi dice che si può avere alcuni problemi di routing. Se si imposta un punto di interruzione all'interno dell'azione ChangeCompany, viene colpito?

Problemi correlati