Скажите, что у меня есть сайт, http://localhost/virtual, где виртуальный является виртуальным каталогом
У меня есть запрос Ajax, который определяется в файле JavaScript с помощью JQuery
$.getJSON("/Controller/Action")
Когда это называют, клиент пытается найти URL на корневом уровне т.е. http://localhost/Controller/Action
Если я добавляю тильду (~) символ в, это превращается в http://localhost/virtual/~/Controller/Action
Это должно (если бы это должно было сделать то, что я хотел), решают на http://localhost/virtual/Controller/Action
Какие-либо идеи о том, как зафиксировать это?
Может быть, $. Getjson ("Контроллер / действие")
будет делать?
Относительный путь к файлу JS был единственным решением, которое я нашел $ .getjson (".. Контроллер / действие")
Ярлыки Tilde для вашего корневого пути к приложению является особенностью ASP.NET, а не часть самих URL. Следовательно, пытаясь использовать URL-адрес с помощью Tilde в 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');
Я успешно использовал это решение
Поместите следующий элемент на вашу главную страницу
<%= 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")