2010-01-22 3 views
17

내가 사이트 가상은 가상 디렉터리자바 스크립트

내가

$.getJSON("/Controller/Action") 

JQuery와

를 사용하여 자바 스크립트 파일에 정의 된 Ajax 요청이에게 있습니다 http://localhost/virtual 을 말해봐 이것을 호출하면 클라이언트는 루트 수준에서 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

위의 Aku의 힌트는 옳았지만 나에게 적합하지 않았습니다. 마지막으로 나는이

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

처럼 사용할 파악하고 내 자바 스크립트에서 나는이

config.contextPath + 'myAppPath "처럼 사용한다.

을 그래서 가상 디렉터리이 경우 "/"+ "myAppPath" 과이 "/ VirtualPath /"+ + "myAppPath"

이 마침내 나를 위해 일한 로 확인되는 가상 디렉터리의 경우 해결합니다.

+0

나를 위해 아름답게 작동! 그리고 간단하게 :) –

2

아마도 $.getJSON("Controller/Action")은?

+0

아니요, 경로에 추가됩니다. js 파일이 루트에있는 경우 작동 할 수 있습니다. – Dann

2

응용 프로그램 루트 경로의 틸드 바로 가기는 ASP.NET 자체의 일부가 아니라 ASP.NET의 특수 기능입니다. 따라서 JavaScript에서 물결표가있는 URL을 사용하려고해도 사이트 루트가 확인되지 않으므로 문자 그대로 ~을 볼 수 있습니다.

URL 자체를 구성 할 수 있도록 응용 프로그램 루트 경로 값을 JavaScript에 전달해야합니다. 나는 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을 발견하는 유일한 솔루션 ("이었다 ../ 컨트롤러/액션 ") 나는

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

자바 스크립트 파일

var baseUrl = ""; 

설정 주에서 전역 변수를 선언하여 masterpage에이 솔루션을 성공적으로

장소 다음과 같은 요소를 사용

14

baseUrl을 자바 스크립트가로드 될 때 "HiddenCurrentUrl"값으로 변경

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

사용 base을

$.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> 
당신이 SomeName 가상 디렉터리 다음 window.g_baseUrl 변수의 뜻에서 응용 프로그램을 실행하면3210

는 기본 URL은 예를 들어

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

입니다 얻을 수 있도록 base을

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

저는 이것을 펑키 한 답변으로 표시하고 있습니다. jQuery와 MVC의 펑키 믹스를 좋아합니다. 하위 문자열이 너무 깨끗하지 않기 때문에 Url.Action을 사용하여 diff를 사용할 수도 있지만 – Dann

+0

이 도움이된다는 것을 알았습니다. Url.Action 솔루션에 만족하지 않으므로 해결 방법을 알려주십시오. 나는 URL 물건을 싫어. 항상 dev/test/prod 환경 사이의 문제. – Andreas

+0

나는 또한 투표했다. 그것은 펑키지만, 지금은 더 우아한 해결책을 생각할 수 없습니다. 그리고 이것은 영리합니다. –

4

또 다른 방법을 사용하여 /SomeName/

이 메소드의 이점은 다음과 같습니다. 이런 식으로 다른 컨트롤러에서 동작을 호출하는 기능

0

그것은 너무 ...이 질문은 아주 오래된하지만 난 요즘이 문제로 고민이 내 아약스 호출에서 잘 작동

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

사용하여 해결할 수였다 알고 늦게이 질문에 답하십시오.그러나 같은 문제가 있었으므로 누군가에게 유용 할 수 있습니다. 위의 답변에서 언급 한 모든 단계를 수행하는 대신 더 나은 방법은 사용하는 것입니다.

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

가상 디렉터리에서 실행중인 경우 URL이 /VIRDIR/controller/action으로 생성되고 그렇지 않은 경우 /controller/action이 생성됩니다.