我有一些内容就是这样的道路:
/Areas/MyUsefulApplication/Content/_awesome_template_bro/Images/MyImage.png
是否有办法获得该路径的完全限定绝对URL,而不是在控制器或视图中(url助手随时可用)。
答案 0 :(得分:9)
你可以写一个扩展方法:
public static class UrlExtensions
{
public static Uri GetBaseUrl(this UrlHelper url)
{
var uri = new Uri(
url.RequestContext.HttpContext.Request.Url,
url.RequestContext.HttpContext.Request.RawUrl
);
var builder = new UriBuilder(uri)
{
Path = url.RequestContext.HttpContext.Request.ApplicationPath,
Query = null,
Fragment = null
};
return builder.Uri;
}
public static string ContentAbsolute(this UrlHelper url, string contentPath)
{
return new Uri(GetBaseUrl(url), url.Content(contentPath)).AbsoluteUri;
}
}
然后假设你有一个UrlHelper实例:
string absoluteUrl = urlHelper.ContentAbsolute("~/Areas/MyUsefulApplication/Content/_awesome_template_bro/Images/MyImage.png");
如果您需要在代码的其他部分执行此操作,而您无权访问HttpContext并构建UrlHelper,那么您应该不应该只有代码的一部分可以访问它与网址。你的代码的其他部分甚至不应该知道url的意思。
答案 1 :(得分:1)
主要问题当然是: 如果不在控制器或视图中,您希望获取URL? Asp.net MVC应用程序中还有哪些其他位置?
如果您正在处理其他不了解Web UI前端的应用程序层,那么这将有点棘手。这些应用程序(程序集)可以具有自定义配置,您可以将Web应用程序路径设置为root,并且可以使用它。但是你必须改变它才能生产。
或向您的其他应用添加System.Web引用并访问当前HttpContext
,因为Darin向您展示了哪种解决方案更加出色。