2016-02-01 4 views
1

Использование VS 2013 в VB, MVC-5: Этот вопрос относится к простому вызову метода контроллера и передаче по строковой переменной из View # 1 (внутри кода JavaScript).Принуждение JavaScript для запуска нового действия контроллера

Контроллер должен навсегда позвонить по номеру № 2. Ключ я думаю, что использование AJAX возвращается к функции в View # 1?

Детали:

Я захватил левой кнопкой мыши событие внутри Cesium.ScreenSpaceEventHandler, и я хочу, чтобы передать определенное значение (строка) в методе контроллера. Затем я хочу, чтобы метод Controller вызывал новый вид.

Теоретически мой вопрос не имеет ничего общего с цезием, за исключением того, что он срабатывает внутри обработчика события click.

Вот код JavaScript в 1 Вид:

var leftClickHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); 

leftClickHandler.setInputAction(function (action) { 
    //reset visibility of selectionIndicator and infoBox 
    viewer.selectionIndicator.viewModel.selectionIndicatorElement.style.visibility = 'visible'; 
    document.getElementsByClassName('cesium-infoBox')[0].style.visibility = "visible"; 

    var pickedObject = viewer.scene.pick(action.position); 
    //don't do anything if we didn't click on an object 
    if (!Cesium.defined(pickedObject)) { return; } 

    //don't do anything if it's not the entity we care about 
    //if (entity !== pickedObject.id) { return; } 

    //if this is the entity we care about, hide the selectionIndicator and infoBox 
    viewer.selectionIndicator.viewModel.selectionIndicatorElement.style.visibility = 'hidden'; 
    document.getElementsByClassName('cesium-infoBox')[0].style.visibility = "hidden"; 

    var myEntity = pickedObject.id; 
    //alert('Picked: ' + myEntity.name); 

    $.ajax({ 
     url: '@Url.Action("JobSelected", "Earth")', 
     type: "POST", 
     dataType: 'text', 
     contentType: 'application/json; charset=utf-8', 
     cache: false, 
     data: myEntity.name, 
     success: function() { 
      alert("okay!"); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert("Error: " + errorThrown + jqXHR); 
     } 
    }); 
}, Cesium.ScreenSpaceEventType.LEFT_CLICK); 

А вот мой контроллер Действие Метод, который я хочу, чтобы вызвать из 1-го просмотра (или аналогичный - TBD):

<HttpPost> 
Public Function JobSelected(jobSpec As String) As ActionResult 
    Dim result = edRepository.GetEarthDataByJobNumber(jobSpec).ToList() 

    Return RedirectToActionPermanent("EarthData2", result) 
End Function 

Я застрял на этом два дня. И я пробовал все, что мог найти, включая использование Ajax (очевидно), но безрезультатно.

Резюме:

Я захватил событие левой кнопкой мыши, которое дает определенное имя задания. Я хотел бы передать это название работы в новое действие контроллера и активировать это действие в новом представлении (в модели которого содержатся подробности этого конкретного задания).

Моя проблема заключается в простом вызове метода контроллера, проходящем по одной единственной переменной (строке), а затем при вызове метода новый вид.

Новая информация: Я заменил вызов Ajax с помощью следующего кода в Вид:

  var myEntity = pickedObject.id; 
 
      //alert("'" + myEntity.name + "'"); 
 

 
      var myUrl = '@Url.Action("JobSelected", "Earth")'; 
 
      var newUrl = myUrl + '?=' + myEntity.name.replace(/ /g, ""); 
 
      var newUrl2 = newUrl.replace("HTI#", ""); 
 
      var newUrl3 = newUrl2.substr(0, newUrl2.indexOf("-")); 
 

 
      window.location.replace(newUrl3);

Большинство из которых некоторые очистки строки myEntity.name который возвращается ранее.

Хорошо, так что это сообщение GREAT (спасибо за помощь), но теперь я просто не могу заставить мой контроллер использовать Query, который теперь находится в гиперссылке. Другими словами, теперь отображается гиперссылка; ../Earth/JobSelected?=1511033 Но что бы я ни делал, я не могу извлечь 1511033, который находится в гиперссылке. Я пробовал:

  Dim q As String = Request.Url.Query 

Это мой текущий метод действия контроллера;

 <ActionName("JobSelected")> 
    Function JobSelected() As ActionResult 
     Dim q As String = Request.Url.Query 
     Dim result = edRepository.GetEarthDataByHtiJobNumber(q).ToList() 

     'The following works fine, so my issue is with obtaining the value (q) to be passed... 
     'Dim result = edRepository.GetEarthDataByHtiJobNumber("1503069").ToList() 

     Return View("EarthData2", result) 
    End Function 

Но это не работает. Я получаю исключение: System.ArgumentOutOfRangeException Любые советы?

Ну, я нашел ответы, которые мне были нужны. Следующие работы; Код JavaScript:

код

  var myEntity = pickedObject.id; 
 
      //alert("'" + myEntity.name + "'"); 
 

 
      var myUrl = '@Url.Action("JobSelected", "Earth")'; 
 
      var newUrl = myUrl + '?jobNumber=' + myEntity.name.replace(/ /g, ""); 
 
      var newUrl2 = newUrl.replace("HTI#", ""); 
 
      var newUrl3 = newUrl2.substr(0, newUrl2.indexOf("-")); 
 

 
      window.location.replace(newUrl3);

контроллер;

 <ActionName("JobSelected")> 
    Function JobSelected() As ActionResult 
     Dim q As String = Request.Url.Query 

     q = Replace(q, "?jobNumber=", "") 
     Dim result = edRepository.GetEarthDataByHtiJobNumber(q).ToList() 

     Return View("EarthData2", result) 
    End Function 
+0

Весь смысл ajax состоит в том, чтобы оставаться на одной странице, поэтому 'Return RedirectToActionPermanent (« EarthData2 », result)' бессмысленно - вызовы ajax никогда не перенаправляются. –

+0

Вы хотите выполнить перенаправление через вызов ajax? Зачем ? Почему бы не перейти непосредственно к методу действий JobSelected в обычном браузере HTTP GET-запрос? Вы можете передать строку как querystring, например 'jobSelected? JobSpec = something' – Shyju

+0

Вы можете использовать' window.location.href = newUrlHere', чтобы выполнить новый запрос GET из вашего js-кода. – Shyju

ответ

0

Будучи новым для размещения на StackOverflow (пользователь давнему, хотя), жаль, что я кладу в ответ редактирования.

Вот ответ: JavaScript:

функция

 var leftClickHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); 
 

 
     leftClickHandler.setInputAction(function (action) { 
 
      //reset visibility of selectionIndicator and infoBox 
 
      viewer.selectionIndicator.viewModel.selectionIndicatorElement.style.visibility = 'visible'; 
 
      document.getElementsByClassName('cesium-infoBox')[0].style.visibility = "visible"; 
 

 
      var pickedObject = viewer.scene.pick(action.position); 
 
      //don't do anything if we didn't click on an object 
 
      if (!Cesium.defined(pickedObject)) { return; } 
 

 
      //don't do anything if it's not the entity we care about 
 
      //if (entity !== pickedObject.id) { return; } 
 

 
      //if this is the entity we care about, hide the selectionIndicator and infoBox 
 
      viewer.selectionIndicator.viewModel.selectionIndicatorElement.style.visibility = 'hidden'; 
 
      document.getElementsByClassName('cesium-infoBox')[0].style.visibility = "hidden"; 
 

 
      var myEntity = pickedObject.id; 
 
      //alert("'" + myEntity.name + "'"); 
 

 
      var myUrl = '@Url.Action("JobSelected", "Earth")'; 
 
      //The following is just clean-up code dealing with myEntity.name 
 
      //Take out the spaces, and add the Query question and equals sign 
 
      var newUrl = myUrl + '?jobNumber=' + myEntity.name.replace(/ /g, ""); 
 
      //Take out the leading, unwanted header 
 
      var newUrl2 = newUrl.replace("HTI#", ""); 
 
      //Take out the trailing text, after the job # 
 
      var newUrl3 = newUrl2.substr(0, newUrl2.indexOf("-")); 
 
      //Redirect to the new page url and fire it up 
 
      window.location.replace(newUrl3); 
 

 
     }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

контроллер;

 <ActionName("JobSelected")> 
    Function JobSelected() As ActionResult 
     Dim q As String = Request.Url.Query 

     q = Replace(q, "?jobNumber=", "") 
     Dim result = edRepository.GetEarthDataByHtiJobNumber(q).ToList() 

     Return View("EarthData2", result) 
    End Function 

Спасибо всем, кто просмотрел или принял участие!

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