Использование 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
Весь смысл ajax состоит в том, чтобы оставаться на одной странице, поэтому 'Return RedirectToActionPermanent (« EarthData2 », result)' бессмысленно - вызовы ajax никогда не перенаправляются. –
Вы хотите выполнить перенаправление через вызов ajax? Зачем ? Почему бы не перейти непосредственно к методу действий JobSelected в обычном браузере HTTP GET-запрос? Вы можете передать строку как querystring, например 'jobSelected? JobSpec = something' – Shyju
Вы можете использовать' window.location.href = newUrlHere', чтобы выполнить новый запрос GET из вашего js-кода. – Shyju