2016-09-14 91 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