2010-01-22 23 views
17

że mam miejsce http://localhost/virtual gdzie wirtualny jest katalog wirtualnyJavascript w katalogu wirtualnego nieświadomi katalogu wirtualnego

Mam żądania Ajax, który jest zdefiniowany w pliku JavaScript użyciu JQuery

$.getJSON("/Controller/Action") 

Po wywołaniu klient próbuje znaleźć adres URL na poziomie podstawowym, tj. http://localhost/Controller/Action

Jeśli dodaję symbol tyldy (~) w, okazuje się http://localhost/virtual/~/Controller/Action

Należy (jeśli to było to, co chciałem) rozwiązać do http://localhost/virtual/Controller/Action

Wszelkie pomysły jak to naprawić?

+0

nie wydaje się być sposób, więc ja po prostu umieścić ścieżkę względną np ../Controller/Action – Dann

+0

Pomaga jeśli powiesz nam oczekiwany wynik. Mówisz nam tylko dwa wyjścia, których nie chcesz. Co chcesz? – slebetman

+0

chcę być wyprowadzane jako http: // localhost/virtual/Controller/Action – Dann

Odpowiedz

22

wskazówkę aku za ponad spojrzał w prawo, ale nie chce pracować dla mnie. W końcu zorientowali się, aby używać go tak jak to

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

a następnie w moim JavaScript używam go jak ten

config.contextPath + „myAppPath”.

Tak więc w przypadku braku tego katalogu wirtualnego postanawia "/" + "myAppPath" aw przypadku katalogu wirtualnego ten postanawia "/ ścieżka_wirtualna /" + "+" myAppPath

a to w końcu pracował dla mnie.

+0

Działa pięknie dla mnie! I proste :) –

2

Może, $.getJSON("Controller/Action") zrobi?

+0

Nie, to po prostu dodają do ścieżki. Może działać, jeśli plik js znajduje się w katalogu głównym. – Dann

2

Skrót tyldy dla ścieżki głównej aplikacji jest specjalną cechą środowiska ASP.NET, a nie częścią samych adresów URL. W związku z tym próba użycia adresu URL z tyldą z JavaScriptu nie rozwiąże głównego katalogu witryny, po prostu da Ci dosłowne ~, jak widać.

Musisz przekazać wartość głównej ścieżki aplikacji do JavaScript, aby mógł sam tworzyć adresy URL. Nie jestem aż tak obeznany z ASP.NET ale wierzę, mógłby zrobić coś takiego:

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

prostszy sposób to zrobić, jeśli wiesz, że istnieje związek na stronie do approot byłoby przeczytać href tego linku:

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

Ścieżka względna do pliku JS był jedynym rozwiązaniem znalazłem $ .getJSON (”../ Controller/Action ")

14

użyłem Takie rozwiązanie z powodzeniem

miejsce następnego elementu w masterpage

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

Zadeklaruj zmienną globalną w głównym pliku JavaScript

var baseUrl = ""; 

Set baseUrl do wartości "HiddenCurrentUrl" po załadowaniu javascript

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

Zastosowanie baseUrl

$.getJSON(baseUrl + "Action") 

EDIT Ulepszone rozwiązanie

W kontrolerze

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

na stronie głównej

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

Użyj swojej baseUrl

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

ja oznakowanie to jako odpowiedź, jak to jest ostry, a ja lubię funkowe miksy jQuery i MVC. Chociaż mogę używać czegoś diff do korzystania Url.Action jako rzecz podciąg nie jest tak czysta – Dann

+0

Wielka że znalazłeś to pomocne! Nie jestem zadowolony z rozwiązania Url.Action, więc proszę powiedz mi, jak to się skończy. Nienawidzę rzeczy z adresów URL. Zawsze występują problemy między środowiskami dev/test/prod. – Andreas

+0

Głosowałem również. To jest funky, ale nie jestem w stanie wymyślić bardziej eleganckiego rozwiązania w tej chwili i działa to ... sprytnie. –

4

Innym sposobem, aby uzyskać url baza jest

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

Na przykład, jeśli uruchomić aplikację z somename katalogu wirtualnego następnie window.g_baseUrl zmienna być równy /SomeName/

Zaletą tej metody jest zdolność zadzwonić działania w innych kontrolerów jak tak

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

Wiem, że to pytanie jest bardzo stary, ale byłem ostatnio zmaga się z tym problemem i był w stanie rozwiązać go za pomocą

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

to działa świetnie na moje wezwanie ajax ...

0

Jest zbyt spóźniony, aby odpowiedzieć na to pytanie.Ale może być użyteczny dla kogoś, ponieważ miałem ten sam problem. Zamiast robić wszystkie te wymienione w powyższych odpowiedziach kroki, lepszym sposobem jest użycie

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

Wygeneruje adres URL /VIRDIR/controller/action, jeśli jest uruchomiony z katalogu wirtualnego lub wygeneruje /controller/action w innym przypadku.

Powiązane problemy