2015-01-05 5 views
5

Я пытаюсь вызвать метод контроллера из javascript, и у меня, похоже, возникают проблемы с его правильной работой. У меня очень мало опыта работы с javascript, и я следил за другими примерами того, как это сделать из stackoverflow, но у меня все еще есть некоторые проблемы - если кто-то может помочь, это будет фантастично.ASP.NET MVC 5 вызов метода контроллера из Javascript Error

В основном то, что я пытаюсь сделать, это установить тег .data на объект javascript в строку, возвращаемую методом на контроллере (этот метод вызывает веб-сервис, который выполняет функцию SQL Server). Метод должен быть передан один параметр, который используется в функции.

код ниже:

Javascript Код

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

JQuery Метод

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

Контроллер Метод

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

контроллер называется NodeController - это то, о чем я говорю в url: вызов ajax.

В основном то, что происходит, когда я запустить страницу, я сначала получаю сообщение об ошибке сказав, что не может установить this.node.fill к нулевому значению ТОГДА я получаю предупреждение о том, что ошибка occurred-, как я сказал, что я довольно неопытный с javascript, поэтому я честно даже не уверен, что он вызывает метод в правильном порядке, если я получаю сообщение об ошибке this.node.fill, прежде чем я получу сообщение об ошибке из JQuery.

Любая помощь или предложения приветствуются !!!

+1

Основные асинхронной ошибки кодирования: Вы не можете вернуть значение из середины функции обратного вызова (например, 'успеха:'), как это происходит долго после выхода вашей функции. @Igor имеет некоторые правильные предложения ниже. –

ответ

5
  1. Если ваш класс контроллер NodeController, используйте только «Node» для имени контроллера в Url.Action:

    url: '@Url.Action("CallService", "Node")', 
    
  2. Вы не можете синхронно возвращать значение из асинхронной функции. Либо передать обратный вызов CallService называться на успех или использование Jquery обещание - http://api.jquery.com/promise/

  3. Мы не знаем, что this.node.fill или где она определена. Вероятно, this.node не определено во время выполнения задания.

+0

Спасибо! Мне нужно было использовать все ваши советы, а также переключить тип с сообщения на сообщение – jhinx

2

Вам не нужно написать контроллер с именем контроллера

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

Я пробовал это, и он не исправил проблему - я все еще вижу те же ошибки в том же порядке – jhinx

+0

Вы пропустили весь " возвращая значение из середины асинхронной функции "проблема :) –

Смежные вопросы