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

Javascript в Virtual Directory не знает о виртуальном каталоге

Скажем, у меня есть сайт   http://localhost/virtual где virtual - виртуальный каталог

У меня есть запрос Ajax, который определен в файле javascript с помощью JQuery

$.getJSON("/Controller/Action")

Когда это вызывается, клиент пытается найти URL-адрес на корневом уровне, т.е.   http://localhost/Controller/Action

Если я добавлю символ тильды (~), он превратится в   http://localhost/virtual/~/Controller/Action

Он должен (если бы он делал то, что хотел) решил   http://localhost/virtual/Controller/Action

Любые идеи о том, как исправить это?

4b9b3361

Ответ 1

Подсказка Aku выше выглядела правильно, но она не хотела работать для меня. Наконец, я решил использовать его так:

<script type="text/javascript">
    var config = {
        contextPath: '<%= @Url.Content("~")  %>'
    };
</script>

а затем в моем JavaScript я использую его следующим образом

config.contextPath + 'myAppPath ".

Таким образом, в случае отсутствия виртуального каталога это "/" + "myAppPath" и в случае виртуального каталога это "/VirtualPath/" + + "myAppPath"

и это, наконец, сработало для меня.

Ответ 2

Я успешно использовал это решение

Поместите следующий элемент на свою главную страницу

<%= Html.Hidden("HiddenCurrentUrl", Url.Action("Dummy"))%>

Объявить глобальную переменную в основном файле javascript

var baseUrl = "";

Установите baseUrl на значение "HiddenCurrentUrl", когда ваш javascript загружен

baseUrl = $("#HiddenCurrentUrl").val();
baseUrl = baseUrl.substring(0, baseUrl.indexOf("Dummy"));

Использовать baseUrl

$.getJSON(baseUrl + "Action")

EDIT Улучшенное решение

В вашем контроллере

ViewBag.BaseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath + "/";

На главной странице

<script type="text/javascript">
    var YourNameSpace = YourNameSpace || {};
    YourNameSpace.config = {
        baseUrl: "@ViewBag.BaseUrl"
    }
</script> 

Используйте baseUrl

$.getJSON(YourNameSpace.config.baseUrl + "Action")

Ответ 3

Другой способ получить базовый URL-адрес -

<script type="text/javascript">
  window.g_baseUrl = '@Url.Content("~")';
</script>

Например, если вы запустите приложение из виртуального каталога SomeName, тогда window.g_baseUrl будет равно /SomeName/

Преимущество этого метода - возможность вызова действий в других таких контроллерах

$.getJSON(window.g_baseUrl + "AnotherController/Action") 

Ответ 4

Может быть, $.getJSON("Controller/Action") будет делать?

Ответ 5

Ярлык тильды для корневого пути вашего приложения является особой особенностью ASP.NET, а не частью самих URL. Следовательно, попытка использовать URL-адрес с тильдой из JavaScript не будет разрешать корень сайта, он просто даст вам буквальный ~, как вы можете видеть.

Вам нужно передать значение корневого пути приложения в JavaScript, чтобы он мог самостоятельно создавать URL-адреса. Я не знаком с ASP.NET, но я считаю, что вы могли бы сделать что-то вроде:

<script type="text/javscript">
    var approot= <%= JavaScriptSerializer.Serialize(Request.ApplicationPath) %>;
    ... $.getJSON(approot+'/Controller/Action') ...;
</script>

Простейший способ сделать это, если вы знаете, что ссылка на странице с соответствующим образом будет состоять в том, чтобы прочитать href этой ссылки:

var approot= $('#homepagelink').attr('href');

Ответ 6

Относительный путь к файлу JS был единственным решением, которое я нашел   $.getJSON( "../Controller/Action" )

Ответ 7

Я знаю, что этот вопрос очень старый, но я в последнее время боролся с этой проблемой и смог его решить, используя

  url:'<%=VirtualPathUtility.ToAbsolute("~/Include/cntrols/Data.aspx") %>',

это отлично работает в моем вызове ajax...

Ответ 8

Слишком поздно ответить на этот вопрос. Но может быть полезно кому-то, поскольку у меня была такая же проблема. Вместо того, чтобы делать все эти шаги, упомянутые выше, лучше использовать

Url.Action('action','controller').

Он будет генерировать url /VIRDIR/controller/action, если он запущен из виртуального каталога или сгенерирует /controller/action в другом случае.