2012-05-24 50 views
3

我必須發佈到URL這樣一個ASP.NET MVC3應用:阿賈克斯,asp.net MVC3路線和相對URL

http://servername.com/Applications/ApplicationName/ 

在我的代碼,我使用jQuery的Ajax請求是這樣的:

$.get(('a/b/c'), function (data) {}, "json"); 

當我在本地運行應用程序時,由於本地頁面以「/」(localhost/a/b/c)結尾,所以ajax請求直接轉到正確的頁面(作爲mvc路由)。

但是,當我發佈到http://servername.com/Applications/ApplicationName/時,尾隨「/」並不總是存在。該網址可能是http://servername.com/Applications/ApplicationName,然後導致ajax請求嘗試加載http://servername.com/Applications/ApplicationNamea/b/c,由於顯而易見的原因而失敗。

我已經研究過重寫URL來追加尾部斜線,但A)它沒有工作,B)我覺得這是一個糟糕的解決方案,並且最好配置無論本地文件夾設置如何,javascript url都能正常工作。

我確實嘗試過「../a/b/c」和「/ a/b/c」,但都沒有效果。

在此先感謝您的幫助!

回答

11

我個人傾向於使用服務器的相對URL的一個全局變量,在我看來這樣的:

var BASE_URL = '@Url.Content("~/")'; 

然後,你可以做這樣的事情:

$.get(BASE_URL + 'a/b/c'), function (data) {}, "json"); 

我想補充一點,如果你希望它是完全全局的,你可以把它添加到您的/Views/Shared/_Layout.cshtml代替。

+0

完美的作品,非常感謝! – Mansfield

+0

很高興幫助! – Steve

+0

尼斯欺騙URL var! –

3

我遇到了同樣的問題,最終創建了兩個JavaScript函數,它們反映了MVC Url幫助程序方法Url.ActionUrl.Content的功能。這些函數在_Layout.cshtml文件中定義,因此可在所有視圖中使用,並且無論應用程序位於本地主機的根目錄中還是位於服務器的子文件夾中,都可以工作。

<script type="text/javascript"> 
    function UrlAction(action, controller) { 
     var url = ('@Url.Action("--Action--","--Controller--")').replace("--Action--", action).replace("--Controller--", controller); 
     return url; 
    } 

    function UrlContent(url) { 
     var path = "@Url.Content("~/--file--")"; 
     path = path.replace("--file--", url.replace('~/', '')); 
     return path; 
    } 
</script> 

這些就被稱爲像這樣:

var url = UrlAction('AvailableAssetClasses', 'Assessment'); 
var url2 = UrlContent('~/Images/calendar.gif'); 
+0

整潔的解決方案。我結束了使用另一個,但這也很有用(因此upvote)。 – Mansfield

3

在ASP.NET MVC應用程序生成的URL時,必須使用網址幫手,從不硬編碼他們。因此,如果這個腳本是直接在視圖中:

<script type="text/javascript"> 
    var url = '@Url.Action("a", "b")'; 
    $.get(url, function (data) {}, "json"); 
</script> 

如果這個腳本是一個單獨的JavaScript文件中(因爲它應該是),您沒有訪問服務器端的助手,你可以簡單地把一些相關DOM元素中的url。例如使用HTML5數據 - *屬性:

<div data-url="@Url.Action("a", "b")" id="foo">Click me</div> 

,然後在你的JavaScript文件:

$('#foo').click(function() { 
    var url = $(this).data('url'); 
    $.get(url, function (data) {}, "json"); 
}); 

,如果你正在悄悄地AJAXifying錨或形式,好了,你已經擁有的網址:

$('a#someAnchor').click(function() { 
    var url = this.href; 
    $.get(url, function (data) {}, "json"); 
    return false; 
});