2015-01-05 12 views
5

Próbuję wywołać metodę kontrolera z javascript i wydaje mi się, że mam problem z jej poprawnym wykonaniem. Mam bardzo małe doświadczenie z javascript i śledziłem inne przykłady tego, jak to zrobić ze stackoverflow, ale wciąż mam pewne problemy - jeśli ktokolwiek może pomóc, to byłoby fantastycznie.Metoda kontrolera wywołującego ASP.NET MVC 5 z JavaScript Error

Zasadniczo próbuję zrobić to ustawić tag .data na obiekcie javascript na ciąg zwracany przez metodę na kontrolerze (ta metoda wywołuje usługę sieci Web, która uruchamia funkcję SQL Server). Metodzie należy podać jeden parametr, który jest używany w funkcji.

Kod jest poniżej:

kod Javascript

for (var i = 0; i < stats.length; i++) 
{ 
    var stat = stats[i].data('id'); 
    var color = CallService(stat); 
    this.node.fill = color; 
} 

JQuery Metoda

function CallService(id) { 
    $.ajax({ 
     url: '@Url.Action("CallService", "NodeController")', 
     type: 'GET', 
     dataType: 'json', 
     cache: false, 
     data: { 'id': id }, 
     success: function (color) { 
      return color; 
     }, 
     error: function() { 
      alert('Error occured'); 
     } 
    }); 
} 

Metoda Controller

[HttpGet] 
    public JsonResult CallService(string id) 
    { 
     var idNum = Convert.ToInt32(id); 
     var StationService = new getStationStatus.Service1SoapClient("Service1Soap"); 
     string color = StationService.getStationStatus(idNum); 
     return Json(color, JsonRequestBehavior.AllowGet); 
    } 

kontroler nazywa się NodeController - co mam na myśli w url: wywołanie ajax.

zasadzie to, co dzieje się, kiedy uruchomić stronę, po raz pierwszy pojawia się błąd mówiąc, że nie można ustawić this.node.fill na wartość null WTEDY pojawia się alert o błędzie occurred- jak powiedziałem jestem całkiem niedoświadczony javascript, więc szczerze mówiąc nie jestem nawet pewien, czy wywołuje metodę w poprawnej kolejności, jeśli dostanę błąd na this.node.fill zanim otrzymam komunikat o błędzie z JQuery.

Każda pomoc lub sugestie są bardzo mile widziane !!!

+1

Podstawowe asynchroniczny błędu kodowania: Nie można zwrócić wartość z połowy funkcji wywołania zwrotnego (jak 'sukcesu:'), jak to się dzieje długo po wyjściu z funkcji. @Igor ma kilka poprawnych sugestii poniżej. –

Odpowiedz

5
  1. Jeśli klasa kontrolera jest NodeController, użyj tylko „Węzeł” w nazwie kontrolera w Url.Action:

    url: '@Url.Action("CallService", "Node")', 
    
  2. Nie możesz synchronicznie zwrócić wartość z funkcji asynchronicznego. Albo przekazać oddzwanianie do CallService się nazywać na sukces lub użyć jQuery obietnicy - http://api.jquery.com/promise/

  3. Nie wiemy, co this.node.fill jest lub gdzie jest on zdefiniowany. Prawdopodobnie this.node nie jest zdefiniowany w momencie wykonywania przypisania.

+0

Dzięki! Musiałem użyć wszystkich twoich wskazówek, a także zmienić typ z geta na post. – jhinx

2

Nie trzeba pisać kontroler o nazwie kontrolera

@Url.Action("CallService", "Node") 
+0

Próbowałem tego i to nie rozwiązało problemu - ciągle widzę te same błędy w tej samej kolejności – jhinx

+0

Tęskniłeś za całością " zwracając wartość od środka asynchronicznej funkcji "problem :) –

Powiązane problemy