Javascript в виртуальном каталоге не знает о виртуальном каталоге - PullRequest
20 голосов
/ 22 января 2010

скажи у меня есть сайт 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

Есть идеи, как это исправить?

Ответы [ 8 ]

24 голосов
/ 23 сентября 2011

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

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

и затем в моем JavaScript я использую это так

config.contextPath + 'myAppPath ".

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

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

15 голосов
/ 30 июня 2010

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

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

<%= 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")

РЕДАКТИРОВАТЬ Улучшенное решение

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

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")
4 голосов
/ 01 августа 2011

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

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

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

Преимущество этого метода заключается в возможности вызывать действия в других контроллерах, например, так:

$.getJSON(window.g_baseUrl + "AnotherController/Action") 
2 голосов
/ 22 января 2010

Ярлык тильды для корневого пути вашего приложения - это особая функция 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');
2 голосов
/ 22 января 2010

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

0 голосов
/ 31 марта 2017

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

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

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

0 голосов
/ 20 ноября 2012

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

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

это прекрасно работает в моем вызове ajax ...

0 голосов
/ 24 января 2010

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

...