我有一条相对路径:
~/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?
答案 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();
}
}