0

我希望你們可以幫助我,我的ASP.NET MVC項目有一個奇怪的路由問題。在ASP.NET MVC項目中爲JavaScript調用設置通用路由

當我將該項目從我的本地主機上運行或在服務器上運行時,總體來說一切正常,而它直接在http://myServerName上部署。當我將應用程序部署到位於不同虛擬目錄下的服務器上的各種環境時,問題就開始了。例如:http://myServerName/QaEnviornmenthttp://myServerName/TestEnviornment

問題是,所有對應用程序URL的Javascript調用都忽略了我的環境虛擬目錄並失敗。 例如我的QA服務器上時,我必須做出一個Ajax調用我採取一個標準的方法,如:

var myUrl = '/ControllerName/ActionMethodName/' 
$.ajax({url:myUrl,success:function(){Do stuff} }) 

因爲我的應用程序部署在http://myServerName/QaEnviornment,當渲染我希望myUrl是http://myServerName/QaEnviornment/ControllerName/ActionMethodName。相反,它回來as http://myServerName/ControllerName/ActionMethodName和當然失敗。

爲了解決這個問題,現在我宣佈,包含環境的文件夾名稱的全局JavaScript變量,當我建立JavaScript調用我要記住,總是構建它們的變種myUrl = myGlobalFolderVar + '/ControllerName/ActionMethodName/'

使用全局JavaScript變量的網址解決這個問題對我來說似乎是一個不好的解決方案。是否有任何事情可以讓路由工作正常進行,以便每當進行JavaScript調用時,應用程序運行的任何子文件夾都始終包含在URL中?

回答

1

,而不是總記得要正確地構建它們,讓你打電話來創建你的網址

function CreateUrl(string path){ 
    return myGlobalFolderVar + path; 
} 

要回答你的第二個問題,不是一個真正的輔助函數。路由不知道請求是什麼,你不能總是依靠X-Http-RequestedWith頭來作出決定。此外,您的站點應用程序根目錄不在域根目錄下,因此路由只能在訪問您的應用程序時才啓動。我知道的唯一的另一種方式是讓MVC爲你生成Url(var url = '@Url.RouteUrl(params)';),但當你在單個或幾個.js文件中使用JavaScript時,這完全沒有幫助。

編輯

以上函數是一個JavaScript函數,可以隨便坐,你想在你的應用程序,包括外部JS文件。至於設置你的myGlobalFolderVar,有幾種方法可以設置它。

1.實際上硬編碼外部JS文件中的變量。

var myGlobalFolderVar = 'TestEnviornment'; 

但是,如果您要部署到多個不同的測試服務器,則很難。

2.如果您使用的是web.config轉換,您可以在web.config轉換中添加一個AppSettings鍵/值對,具體取決於構建類型。然後,使用該值,在您的母版頁佈局/視圖中設置全局JavaScript變量。

<appSettings xdt:Transform="Replace"> 
    <add key="folderLocation" value="TestEnvironment" /> 
    </appSettings> 

在外部JS文件

//this makes it a site wide/global variable in any place you 
//include your external JS file 
    var myGlobalFolderVar = ''; 

而在你的主視圖

<script type="text/javascript"> 
    myGlobalFolderVar = '@ConfigurationManager.AppSettings["folderLocation"]' 
</script> 

3.Same兩個號,但使用的網址助手找出路徑您的應用程序在您的主視圖中,而不是使用web.config轉換

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

基本思想是使用.NET找出它的存在位置,並用該路徑信息設置一個全局JavaScript變量。然後,結合本答案頂部提供的helper JavaScript函數,您可以根據需要在整個應用程序中正確生成路徑 - 無論路徑深度,部署位置或任何其他部署類型問題。

var myUrl = CreateUrl('/ControllerName/ActionMethodName/'); 
$.ajax({url:myUrl,success:function(){Do stuff} }); 
+0

只有Javascript代碼是在視圖內部構建的,但這隻會工作,對不對?如果一個腳本存儲在一個包含的外部.js文件中,這不會被使用,是嗎?儘管謝謝你的迴應! – Shenaniganz

+0

是的 - 如果你把它放在一個外部JS文件中,那麼上面的那個函數(它是JS而不是c#)在任何地方都是可用的。你會像其他任何JS函數一樣調用它。注 - >這不會進入document.ready類型處理程序,但是是獨立的。 – Tommy