Имя функции не существует в текущем контексте - это ошибка, которую она мне выдает. Мне нужен динамический вызов ajax. Почему это происходит? Я получаю, что обработчики обрабатываются на стороне сервера, но я не знаю, как обойти эту проблему.

var getManager = function (functionName, contentDiv) {
    console.log("aircraft manager refresh called");
    $.ajax({
        type: "GET",
        url: '@Url.Action(functionName, "AdminTools")',
        cache: false,
        data: {},
        error: function () {
            alert("An error occurred.");
        },
        success: function (data) {
            $("#".concat(contentDiv)).html(data);
        }
    });
}
0
Travis Tubbs 10 Янв 2017 в 20:27
3
Это не так. Вызовы @Url.Action вызываются на стороне сервера . К моменту запуска вашего скрипта он уже был заменен фактическим URL-адресом
 – 
haim770
10 Янв 2017 в 20:31
2
Просто создайте строку с помощью JavaScript url: "AdminTools/" + functionName
 – 
Jasen
10 Янв 2017 в 20:32
Я смотрел на то, чтобы просто поместить помощника в качестве параметра, не считается ли это плохой практикой жестко кодировать URL-адреса в вызовах ajax?
 – 
Travis Tubbs
10 Янв 2017 в 20:33
1
Это не лучший вариант, но без дополнительного контекста в этом суть решения.
 – 
Jasen
10 Янв 2017 в 20:34
@Url.Action() - это код бритвы, который оценивается на сервере перед отправкой клиенту. functionName - это переменная javascript на стороне клиента, которая в данный момент не существует (не входит в область видимости)
 – 
user3559349
10 Янв 2017 в 23:05

1 ответ

Лучший ответ

Я настоятельно рекомендую вам не объединять серверный и клиентский код, например:

$.ajax({
    type: "GET",
    url: '@Url.Action(functionName, "AdminTools")',  //THIS

Это превратится в кошмар обслуживания. Вместо:

<div id="#contentDiv" data-url="@Url.Action(functionName, "AdminTools")">
@* content *@
</div>

Тогда

var getManager = function (functionName, contentDiv) {
  console.log("aircraft manager refresh called");
  var url = contentDiv.data("url");
  $.ajax({
    type: "GET",
    url: url,
    // .....

Если позже вы решите иметь несколько contentdivs , у каждого из них может быть собственный URL-адрес, и ваш код можно будет использовать повторно.

5
Erik Philips 10 Янв 2017 в 20:33
Отличный ответ! Получил свое голосование. Для ясности, можем ли мы удалить параметр «functionName» из конструкции функции? как в "var getManager = function (contentDiv) {..........."
 – 
DaniDev
10 Янв 2017 в 22:30
Это более абстрактный ответ, показывающий, как разделить информацию. Если вам нужно что-то конкретное для решения текущей проблемы, я настоятельно рекомендую использовать кнопку «Задать вопрос». В противном случае эти комментарии будут слишком болтливыми по поводу вопроса, не соответствующего теме этого вопроса.
 – 
Erik Philips
11 Янв 2017 в 00:02
Нет, работая над проблемой, я просто подумал, что есть смысл удалить параметр (functionName), чтобы не путать .... ;-) Спасибо за ваш ответ.
 – 
DaniDev
11 Янв 2017 в 02:02