Подтвердить что ты не робот

Как получить относительный путь в 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 мог быть вызван со страниц в любом каталоге в моем приложении?

4b9b3361

Ответ 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 '/'
    //...
});