#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, не разрешался правильно.