HttpRequest.ApplicationPath

  • 206
  • 0
  • MVC
  • 2019-06-26

取得目前應用程式的虛擬路徑。

在JS使用window.open('../ControllerName/ActionName','網頁名稱'); 開啟新頁面的時候,使用相對路徑去呼叫要執行的Action

在本機使用LocalHost開發網站的時候,登入頁網址長這樣:

http://localhost:3794/LOGIN/SSOLogin

執行起來沒有問題

不過佈署到Sever之後,通常會在IIS設定虛擬路徑 EMPLOYEE

正常的網址長這樣: http://192.168.51.224/EMPLOYEE/LOGIN/SSOLogin,

但是客戶通常會要求要RouteConfig裡面做一些設定

今天如果使用者網址只打 http://192.168.51.224/EMPLOYEE/ ,我也是要可以導到正常的登入頁

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "LOGIN", action = "SSOLogin", id = UrlParameter.Optional }
            );

這時候使用者如果只輸入http://192.168.51.224/EMPLOYEE  一樣會正常的顯示登入頁,

不過這個時候如果使用原本的 window.open('../ControllerName/ActionName','網頁名稱'); 開啟新頁面的時候,在IIS裡面就會找不到路徑了

或是要透過ajax呼叫後端的action的時候,也會出現錯誤

解決方法是在後端先取得 HttpRequest.ApplicationPath ,在前端埋一個隱藏欄位去存這個值

function OpenDescriptionPage() {
    //Request.ApplicationPath 的值
    var webAP = $('#hidWEBAP').val();

    // 本機開發 http://localhost:3794/LOGIN/SSOLogin 的時候,Request.ApplicationPath 就是 /
    // 如果是佈署到IIS,則會顯示 IIS設定虛擬路徑 EMPLOYEE/
    if (webAP == '/') {
        webAP = '..';
    }

    window.open(webAP + "/LOGIN/SSOLoginDescription", 'SSOLoginDescription', config = 'width=800,height=380,scrollbars=yes,resizable=yes,toolbar=yes');
}

這樣就可以解決路徑的問題