2015-01-05 11 views
5

Ich versuche, eine Controller-Methode von Javascript aufrufen, und ich habe Probleme, dies korrekt ausgeführt zu bekommen. Ich habe sehr wenig Erfahrung mit Javascript und habe andere Beispiele verfolgt, wie man dies von stackoverflow macht, aber ich habe immer noch einige Probleme - wenn jemand helfen kann, wäre das fantastisch.ASP.NET MVC 5 Aufruf der Controller-Methode aus Javascript Fehler

Im Grunde, was ich versuche, ist ein .Data-Tag auf ein JavaScript-Objekt auf die Zeichenfolge von einer Methode auf dem Controller zurückgegeben (diese Methode ruft einen Webservice, der eine SQL Server-Funktion ausführt). Der Methode muss ein Parameter übergeben werden, der in der Funktion verwendet wird.

ist Der folgende Code:

Javascript-Code

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

JQuery Methode

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

Controller-Methode

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

der Controller heißt der NodeController- was ich in URL: Aufruf von AJAX.

Im Grunde, was passiert, wenn ich die Seite ausführen, ich zum ersten Mal einen Fehler sagen, es ist nicht this.node.fill auf einen Nullwert DANN einstellen kann ich die Warnung erhalten, dass ein Fehler occurred- wie ich sagte, ich bin ziemlich unerfahren mit Javascript, also bin ich ehrlich gesagt nicht einmal sicher, ob es die Methode in der richtigen Reihenfolge aufruft, wenn ich einen Fehler auf this.node.fill bekomme, bevor ich die Fehlermeldung von JQuery erhalte.

Alle/alle Hilfe oder Vorschläge wird sehr geschätzt !!!

+1

Grund async Codierungsfehler schreiben: Sie können einen Wert aus der Mitte einer Callback-Funktion (wie 'Erfolg:') zurück, wie die lange geschehen nachdem Ihre Funktion beendet wurde. @Igor hat unten einige richtige Vorschläge. –

Antwort

5
  1. Wenn Ihr Controller-Klasse NodeController ist, verwenden Sie nur "Node" für den Controller-Namen in Url.Action:

    url: '@Url.Action("CallService", "Node")', 
    
  2. Sie können nicht synchron Wert von einer asynchronen Funktion zurückzukehren. Entweder einen Rückruf an CallService weitergeben Erfolg oder Verwendung jquery Versprechen genannt werden - http://api.jquery.com/promise/

  3. Wir wissen nicht, was this.node.fill ist oder wo es definiert ist. Wahrscheinlich ist this.node zum Zeitpunkt der Ausführung der Zuweisung nicht definiert.

+0

Danke! Ich musste alle Ihre Tipps verwenden, sowie den Typ von einem bekommen zu einem Beitrag wechseln – jhinx

2

Sie müssen nicht-Controller mit dem Controller-Namen

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

Ich habe das versucht und es nicht das Problem behoben - ich sehe immer noch die gleichen Fehler in der gleichen Reihenfolge – jhinx

+0

Sie haben das ganze verpasst " Rückgabe eines Wertes aus der Mitte einer asynchronen Funktion "Problem :) –