jQuery Ajax: ссылка на URL контроллера MVC из корня приложения

#jquery #asp.net-mvc #url #qunit

#jquery #asp.net-mvc #url #qunit

Вопрос:

У меня есть ASP.NET Веб — приложение MVC, запущенное из http://localhost/myappname . Из jQuery я выполняю вызовы jQuery $.ajax() для возврата частичных представлений на основе некоторых действий пользователя. Обычно я вызываю это из представления в том же контроллере, который содержит функцию, которую я вызываю через Ajax. Например, представление в моем домашнем контроллере имеет следующую функцию (которая работает хорошо):

 function loadMyPartialView() {
    $.ajax({
      type: 'GET',
      url: 'Home/GetNavigationTreePV/',
      success: function (data) { onSuccess(data); },
      error: function (errorData) { onError(errorData); }
    });
    return true;
}
  

Указанный выше URL-адрес будет разрешен http://localhost/myappname/Home/GetNavigationTreePV , и частичное представление будет возвращено правильно.

Теперь я пытаюсь использовать qUint для модульного тестирования своих функций. В этом тестовом примере я просто хочу убедиться, что я дошел до конца функции и вернул true . Я создал QUNIT контроллер и соответствующее представление (которое загружает мой модульный тестовый файл JavaScript). Из test.js в файле, содержащем мои модульные тесты, я пытаюсь выполнять вызовы тех же функций, которые находятся в моих домашних представлениях, как показано выше. Но, поскольку у меня сейчас заканчивается QUNIT контроллер, URL-адрес разрешается http://localhost/myappname/qunit/Home/GetNavigationTreePV .

Я попытался изменить URL-адрес моего ajax-запроса на /Home/GetNavigationTreePV/ (с предыдущей косой чертой), но когда я это делаю, я получаю следующий URL http://localhost/myappname/Home/GetNavigationTreePV .

Итак, чтобы было ясно, я пытаюсь написать свой ajax-запрос таким образом, чтобы он всегда начинался с корня моего приложения MVC, а затем добавлял параметр url, указанный в моей функции $.ajax() .

Есть ли простой способ сделать это? Я делаю это странным образом?

Ответ №1:

Я думаю, что на вашей странице просмотра MVC вам нужен @Url.Action

    function loadMyPartialView() {
        $.ajax({
          type: 'GET',
          url: '@Url.Action("GetNavigationTreePV", "Home")',
          success: function (data) { onSuccess(data); },
          error: function (errorData) { onError(errorData); }
        });
        return true;
    }
  

В качестве альтернативы вы можете использовать @Url.Content

    function loadMyPartialView() {
        $.ajax({
          type: 'GET',
          url: '@Url.Content("~/home/GetNavigationTreePV")',
          success: function (data) { onSuccess(data); },
          error: function (errorData) { onError(errorData); }
        });
        return true;
    }
  

Если это находится в файле .js, вы можете передать URL, например

loadMyPartialView(‘@Url.Action(«GetNavigationTreePV», «Home»)’)

Комментарии:

1. Не повезло. В этом случае URL-адрес был разрешен следующим образом: localhost/ctsw/qunit/@Url.Action ….

2. Ах, хорошо… в этом случае, я думаю, мне может понадобиться сделать это из файла .js, чтобы использовать платформу тестирования QUnit. Позвольте мне посмотреть, могу ли я писать модульные тесты в представлении.

3. Вы можете передать URL-адрес в javascript, например, loadMyPartialView(‘@Url.Action(«GetNavigationTreePV», «Home»)’)

4. Это тоже была моя мысль, но я ищу способ не делать этого первым. Это крайний случай, когда нужно действовать в крайнем случае. Тем не менее, я очень ценю ваш вклад!

Ответ №2:

Я смог добиться этого с помощью прямого JavaScript window.location.pathname . Смотрите следующий пример:

 function loadMyPartialView() {
    $.ajax({
      type: 'GET',
      url: window.location.pathname   'Home/GetNavigationTreePV/',
      success: function (data) { onSuccess(data); },
      error: function (errorData) { onError(errorData); }
    });
    return true;
}
  

Комментарии:

1. Это именно то, что я тоже искал. Я столкнулся с проблемой при развертывании моего приложения в IIS, в этом случае URL-адрес, указанный в файле js, не разрешался правильно.