2010-01-22 150 views
17

說我有網站 http://localhost/virtual 其中虛擬是虛擬目錄的Javascript虛擬目錄不知道虛擬目錄的

我有一個JavaScript文件中使用JQuery

$.getJSON("/Controller/Action") 

定義一個Ajax請求當這個被調用時,客戶端試圖在根級找到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」 並在此解析爲 「/ VirtualPath /」 + +「myAppPath」

,這終於爲我工作的虛擬目錄的情況下。

+0

爲我精心製作!簡單:) –

2

也許,$.getJSON("Controller/Action")會做什麼?

+0

不,它只是添加到Path中。如果js文件位於根目錄下,它可能會工作。 – Dann

2

應用程序根路徑的代字號快捷方式是ASP.NET的一個特殊功能,不是URL本身的一部分。因此,嘗試使用來自JavaScript的帶有波形符號的URL不會解析站點根目錄,它只會爲您提供文字~,如您所見。

您需要將應用程序根路徑的值傳遞給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的唯一解決方案(」 ../控制器/動作「)

14

我用這個解決方案成功

將下面的元素在你的母版

<%= 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") 

編輯改進方案

在你的控制器

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解決方案不滿意,請告訴我最終如何解決它。我討厭網址的東西。總是在開發/測試/產品環境之間出現問題。 – Andreas

+0

我投票了。它很時髦,但我現在無法想到更優雅的解決方案,而且這種方法很聰明。 –

4

另一種方式來獲得一個基本URL是

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

例如,如果您從SomeName虛擬目錄,然後 window.g_baseUrl變量將運行你的應用程序等於/SomeName/

這種方法的好處是來調用其他控制器的動作就像一個能力,使

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

我知道這個問題是很老,但我最近這個問題苦苦掙扎,並能夠使用

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

這部作品在我的Ajax調用極大地解決它......

0

實在是太遲到回答這個問題。但是,如果我有同樣的問題,可能對某人有用。而不是採取上述答案中提到的所有步驟,更好的方法是使用

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

如果在虛擬目錄下運行,或者在其他情況下生成/controller/action,它將生成url /VIRDIR/controller/action