2016-09-14 88 views
0

我有一個相對路徑:獲取相對URL在MVC 4

~/Content/themes/base/jquery-ui.min.css" 

,我有一個隱藏的輸入:

<input type="hidden" id="siteUrl" value=""/> 

在MVC我想的完全合格的URL存儲到隱藏字段。我曾嘗試:

<input type="hidden" id="siteUrl" value="@Url.RequestContext.HttpContext.Request.MapPath("~/Content/themes/base/jquery-ui.min.css")"/> 

<input type="hidden" id="siteUrl" value="@HttpContext.Current.Request.MapPath("~/Content/themes/base/jquery-ui.min.css")"/> 

但這些都返回一個物理路徑,我需要的URL。我也嘗試使用UriBuilder但是這對我不起作用,因爲雖然它可能在我的本地主機上工作,但它不會在我將它發佈到我的IIS服務器時使用。

我也曾嘗試:

<input type="hidden" id="siteUrl" value="@Url.Content("~/Content/themes/base/jquery-ui.min.css")"/> 

但它返回/Content/themes/base/jquery-ui.min.css

,在我的MVC控制器我想:

Page.ResolveClientUrl("~/Content/themes/base/jquery-ui.min.css"); 

也沒有做什麼,我需要。

背景:

我存儲FQ網址到隱藏字段,然後訪問它的JS,在JS當我使用一個相對URL它不知道如何因爲MVC每個正確使用鏈接路徑的變化,它只是大頭針上,以這樣的結尾相對字符串: http://localhost/~/Content/themes/base/jquery-ui.css

如果我只是刪除~/然後它http://localhost/Content/themes/base/jquery-ui.css,但是當我點擊進入到一個新的鏈接路徑不再好:http://localhost/newLink/Content/themes/base/jquery-ui.css

我的本地主機上的網址是http://localhost/Content/themes/base/jquery-ui.css 並在我的服務器上它的http://server/productName/Content/themes/base/jquery-ui.css我不想編寫一些靜態名稱,以防將來基本服務器URL發生變化。

那麼如何獲取相對路徑的完全限定URL?

+0

@RoryMcCrossan'Server.MapPath'剛剛返回的物理路徑,我需要完全合格的URL即通過'http://域。 COM /產品名稱/內容/ ...' – Blindsyde

+0

您的應用程序在prduction中被部署爲「webapplication」,而它在開發服務器中作爲「網站」運行(這些是IIS術語)。區別在於虛擬路徑System.Web.HttpRuntime.AppDomainAppVirtualPath,在本例中爲「productName」。使用@ Url.Content(「〜/ Content/themes/base/jquery-ui.min.css」)應該是你需要的,因爲它只包含虛擬路徑**當你需要時。您認爲這是錯誤的,因爲您沒有嘗試在IIS Express和本地IIS中進行部署。在本地IIS中部署時,將包含應用程序名稱。 – derloopkat

回答

2

我不知道你UriBuilder是有什麼問題,但是這是最好的方法:

@{ 
    var uriBuilder = new UriBuilder(Request.Url); 
    uriBuilder.Path = Url.Content("~/Content/themes/base/jquery-ui.min.css"); 
} 
<input type="hidden" id="siteUrl" value="@uriBuilder.ToString()"/> 

你開始Request.Url,所以你不必硬編碼主機。這樣,它應該在你部署它的任何地方工作。然後您更改Path,但您需要使用Url.Content來替換~,而不管它應該是第一個。

您可能要真正添加自己UrlHelper擴展以及:

public static class UrlHelperExtensions 
{ 
    public static string AbsoluteContent(this UrlHelper helper, string contentPath) 
    { 
     return new Uri(helper.RequestContext.HttpContext.Request.Url, helper.Content(contentPath)).ToString(); 
    } 
} 
+0

太棒了!這工作,非常感謝你,我幾乎成了一個禿頭男人..我認爲我遇到的問題是因爲我使用了'Request.Url.AbsolutePath' – Blindsyde