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
Любые идеи о том, как исправить это?
Ответы
Ответ 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
в другом случае.