我有一些内容,它位于这样的路径中:
/Areas/MyUsefulApplication/Content/_awesome_template_bro/Images/MyImage.png
是否有一种方法可以获得该路径的完全限定绝对URL,而不需要在控制器或视图中(其中url助手readily available)。
我有一些内容,它位于这样的路径中:
/Areas/MyUsefulApplication/Content/_awesome_template_bro/Images/MyImage.png
是否有一种方法可以获得该路径的完全限定绝对URL,而不需要在控制器或视图中(其中url助手readily available)。
You could write an extension method:
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");
如果您正在谈论未意识到Web UI前端的其他应用程序层,则会有一些棘手。这些应用程序(程序集)可以具有自定义配置,您可以在其中放置Web应用程序路径根,然后它们可以使用该路径。但是您必须为生产环境更改它。
或者向您的其他应用程序添加System.Web引用,并访问Darin向您展示的当前HttpContext
,这是一种更好的解决方案。
HttpContext.Current
不是我想在我的应用程序中看到的代码类型,所以我故意引入这个限制,以便开发人员不会被诱惑在不应该使用该类的地方使用它。否则他们最终会在服务层等地方使用它,而我将感到不满意 :-) - Darin Dimitrov(HttpContext.Current != null)
),我不明白为什么在静态类中这是不可能的。这将防止在非Web应用程序类型中调用你的功能。 - Robert Koritnik