2013-06-18 17 views
5

Próbuję użyć jQuery w celu odpalenia połączenia Ajax po kliknięciu określonego przycisku. Czytałem kilka przykładów składni i problemów, które można napotkać, ale nie udało mi się znaleźć działającego rozwiązania dla mojej przyczyny. Oto kod.jQuery Ajax nie zadzwonił do metody kontrolera MVC 4

Metoda Kontroler: (HomeController.cs)

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

Kod 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); 
     } 
    }); 
} 

I wreszcie, dzwonię z tej funkcji:

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

moją wiadomość debugowania wyświetla się poprawnie, a połączenie Ajax ciągle kończy się niepowodzeniem z następującym ostrzeżeniem: R: [object Object] S: error E: Not Found

Nie jestem do końca pewien, co o tym myśleć.

Wiem, że jest kilka pytań na ten temat, ale żaden z nich nie wydaje się rozwiązać mojego problemu i nie jestem naprawdę pewien, co jest nie tak z tymi blokami kodu. Każdy wgląd byłby doceniony.

EDYCJA: W przypadku, gdy jest to warte odnotowania, dotyczy to urządzenia mobilnego. Testowanie w emulatorze Windows 8 Phone (Internet Explorer), obok jQuery Mobile. Nie jestem pewien, czy to ma wpływ na Ajaxa w ogóle EDYCJA 2: Po obejrzeniu surowego połączenia sieciowego wygląda na to, że 'Url.Action("ChangeCompany", "Home")' nie jest konwertowany na właściwy adres URL i zamiast tego jest wywoływany bezpośrednio tak, jakby był nieprzetworzonym adresem URL tekst. Czy to z powodu przestarzałej jQuery, czy jakiegoś innego czynnika?

+0

Jak wygląda twoja metoda działania kontrolera? Zobacz także surowe połączenie sieciowe w narzędziach przeglądarki i zobacz, co to jest połączenie - które powinno pomóc w rozwiązywaniu problemów. –

+0

Myślę, że to błąd po stronie serwera. Czy możesz sprawdzić pasek narzędzi Toolbar w przeglądarce Chrome, gdy klikniesz żądanie, aby zobaczyć odpowiedź na karcie Podgląd. –

+0

Jeśli spojrzeć na źródło w przeglądarce, adres URL wygląda dobrze? A jeśli ustawisz 'debugger;' w funkcji błędu, przyjrzyj się parametrom. –

Odpowiedz

6

Ok z EDIT2 wydaje się, że używasz url: '@Url.Action("ChangeCompany", "Home")', w osobnym pliku JavaScript. możesz napisać tylko kod brzytwy w pliku .cshtml i nie działa on wewnątrz plików .js

+0

Ach, to ma sens. Nie wiem, dlaczego myślałem, że mogę go użyć poza widokiem. – DrBowe

+0

Poszedłem dalej i zakodowałem adres URL do wywołania Ajax i teraz działa dobrze, dzięki za złapanie! – DrBowe

+0

można utworzyć zmienną w .cshtml za pomocą adresu URL i uzyskać do niej dostęp w pliku .js –

1

Brakuje niektórych ważnych parametrów w swoim wywołaniu AJAX. Zmienić wywołanie AJAX, jak poniżej:

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); 
         } 
      });} 

Następnie można opisywać metodę kontrolera z [HttpPost] atrybutu jak poniżej;

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

Wykonałem następujące czynności i otrzymałem ten sam komunikat o błędzie. Nie jesteś pewien, na czym polega problem. – DrBowe

0

Pamiętaj, że Twoje działanie nie zwraca bezpośrednio numeru companyCode. Jesteś przypisując je do formatu JSON result własności zatem W funkcji sukcesu wyświetlać prowadzić trzeba mieć:

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

również w tym: E: Not Found mówi mi, że może masz jakieś problemy routingu. Jeśli ustawisz punkt przerwania wewnątrz działania ChangeCompany, czy jest on trafiany?

Powiązane problemy