Как получить относительный путь в Javascript?
В моем веб-проекте ASP.net я написал следующий код Javascript в файле .js:
function getDeviceTypes() {
var deviceTypes;
$.ajax({
async: false,
type: "POST",
url: "Controls/ModelSelectorWebMethods.aspx/getDeviceTypes",
data: '{ }',
contentType: "application/json;",
dataType: "json",
success: function(response) {
deviceTypes = response.d;
},
error: function(xhr, status) {
debugger;
alert('Error getting device types.');
}
}); // end - $.ajax
return deviceTypes;
}
Он отлично работал, пока я не попытался загрузить этот .js файл на страницу в подкаталоге.
Предположим, что имя моего проекта widget
.
Когда я использую этот код в основном виртуальном каталоге, Javascript интерпретирует Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
как означающий https://mysite.com/widget/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
, и все хорошо. Однако со страницы в подкаталоге Javascript интерпретирует ее как означающую https://mysite.com/widget/subdirectory/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
, и она не работает.
Как я могу написать свой Javascript-код, чтобы веб-метод AJAX мог быть вызван со страниц в любом каталоге в моем приложении?
Ответы
Ответ 1
У вас есть два варианта:
-
Создайте объект конфигурации/предпочтений в JavaScript, который содержит все ваши специфические для среды настройки:
var config = {
base: <% /* however the hell you output stuff in ASPX */ %>,
someOtherPref: 4
};
а затем префикс URL-адреса AJAX с помощью config.base
(и измените значение для config.base
, находитесь ли вы на сервере dev/testing/deployment.)
-
Используйте тег <base />
, чтобы установить префикс URL для всех относительных URL-адресов. Это влияет на все относительные URL: изображения, ссылки и т.д.
Лично я бы пошел на вариант 1. Скорее всего, вы найдете этот объект конфигурации, который вам удобен в другом месте.
Очевидно, что объект конфигурации должен быть включен в часть вашего сайта, где оценивается серверный код; Файл .js
не будет вырезать его без настройки вашего сервера. Я всегда включаю объект config в HTML <head>
; его небольшой конфигурационный объект, содержимое которого может меняться на каждой странице, поэтому он прекрасно защищает его.
Ответ 2
Пока вам не нужны виртуальные каталоги asp.net(что делает невозможным вычисление из script, вам нужно будет что-то передать с сервера), вы можете посмотреть URL-адрес и разбор это:
function baseUrl() {
var href = window.location.href.split('/');
return href[0]+'//'+href[2]+'/';
}
то
...
url: baseUrl()+"Controls/ModelSelectorWebMethods.aspx/getDeviceTypes",
...
... и теперь из ваших комментариев выше видно, что виртуальные каталоги являются проблемой. Обычно я это делаю.
1) На вашей главной странице введите код для вставки script где-нибудь, желательно перед чем-либо еще (я добавляю его непосредственно в HEAD, добавляя элементы управления вместо использования ScriptManager), чтобы убедиться, что он запускается перед любым другим script. С#:
string basePath = Request.ApplicationPath;
// Annoyingly, Request.ApplicationPath is inconsistent about trailing slash
// (if not root path, then there is no trailing slash) so add one to ensure
// consistency if needed
string myLocation = "basePath='" + basePath + basePath=="/"?"":"/" + "';";
// now emit myLocation as script however you want, ideally in head
2) Измените baseUrl, чтобы включить это:
function baseUrl() {
var href = window.location.href.split('/');
return href[0]+'//'+href[2]+basePath;
}
Ответ 3
Создайте корневую переменную приложения...
var root = location.protocol + "//" + location.host;
И используйте абсолютный URI (вместо относительного), когда вы делаете запросы AJAX...
url: root + "/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes"
Ответ 4
Я думаю, что эта функция будет работать... чтобы получить относительный путь как "../../../"
поэтому, если вы вызываете эту функцию на каждой странице, это возвращает относительный формат пути.
function getPath() {
var path = "";
nodes = window.location. pathname. split('/');
for (var index = 0; index < nodes.length - 3; index++) {
path += "../";
}
return path;
}
Ответ 5
Вы можете импортировать пространство имен в начале: System.Web.Hosting.HostingEnvironment
<%@ Master Language="VB" AutoEventWireup="false" CodeFile="Site.master.vb" Inherits="Site" %>
<%@ Import namespace="System.Web.Hosting.HostingEnvironment" %>
и на js:
<script type="text/javascript">
var virtualpathh = "<%=ApplicationVirtualPath %>";
</script>
Ответ 6
Не могли бы вы использовать window.location.pathname
?
var pathname = window.location.pathname;
$.ajax({
//...
url: pathname + 'Controls/...', // might need a leading '/'
//...
});