2010-01-22 3 views
17

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

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

$.getJSON("/Controller/Action") 

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

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

Он должен (если он должен был сделать то, что я хотел) постановляем http://localhost/virtual/Controller/Action

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

+0

Кажется, что это не так, поэтому я просто установил относительный путь, например. ../Controller/Action – Dann

+0

Это помогает, если вы сообщите нам ожидаемый результат. Вы только сообщаете нам два выхода, которые НЕ ДОЛЖНЫ хотеть. Что ты хочешь? – slebetman

+0

Я хочу, чтобы он выводился как http: // localhost/virtual/Controller/Action – Dann

ответ

22

Подсказка Акуна выглядела правильно, но она не хотела работать для меня. В конце концов я понял, чтобы использовать его как этот

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

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

config.contextPath + «myAppPath».

Таким образом, в случае отсутствия виртуального каталога этого решает «/» + «myAppPath» и в случае виртуального каталога это решает для «/ виртуальный_путь /» + + «myAppPath»

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

+0

Прекрасно работает для меня! И просто :) –

2

Возможно, $.getJSON("Controller/Action") будет делать?

+0

Нет, он просто добавляет к Пути. Он может работать, если файл js находится в корне. – Dann

2

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

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

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

Более простой способ сделать это, если вы знаете, что есть ссылка на страницу в approot будет читать href по этой ссылке:

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

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

14

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

Поместите следующий элемент в вашем MasterPage

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

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

var baseUrl = ""; 

Set 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") 
+0

Я отмечаю это как ответ, потому что он напуган, и мне нравятся фанковые миксы jQuery и MVC. Хотя я мог бы использовать что-то diff для использования Url.Action, поскольку подстрока вещь не такая чистая – Dann

+0

Отлично, что вы нашли это полезным! Я не удовлетворен решением Url.Action, поэтому, пожалуйста, расскажите мне, как вы решаете его. Я ненавижу контент URL. Всегда проблемы между средами dev/test/prod. – Andreas

+0

Я тоже голосовал. Это напуганно, но сейчас я не могу придумать более элегантное решение, и это работает ... умно. –

4

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

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

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

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

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

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

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

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

0

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

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

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

Смежные вопросы