ASP.NET MVC - 要从外部控制器或视图确定的内容的绝对URL

时间:2011-09-01 04:08:12

标签: asp.net asp.net-mvc routing url-routing

我有一些内容就是这样的道路:

  

/Areas/MyUsefulApplication/Content/_awesome_template_bro/Images/MyImage.png

是否有办法获得该路径的完全限定绝对URL,而不是在控制器或视图中(url助手随时可用)。

2 个答案:

答案 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向您展示了哪种解决方案更加出色。