获取MVC 4中的相对URL

时间:2016-09-14 15:26:02

标签: javascript jquery asp.net-mvc asp.net-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 URL存储到隐藏字段中,然后我在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?

1 个答案:

答案 0 :(得分: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();
    }
}