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

4

我有一些内容,它位于这样的路径中:

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

是否有一种方法可以获得该路径的完全限定绝对URL,而不需要在控制器或视图中(其中url助手readily available)。

2个回答

9

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");

如果您需要在代码的其他部分执行此操作,而又无法访问HttpContext并构建UrlHelper,则不应该这样做,因为只有访问HttpContext的代码部分才应处理URL。代码的其他部分甚至不应知道什么是URL。

但那是在控制器或视图中 - 基本上是在Asp.net MVC应用程序中...不是吗? - Robert Koritnik
2
@Robert Koritnik,在静态类中无法访问HttpContext。对我来说,HttpContext.Current不是我想在我的应用程序中看到的代码类型,所以我故意引入这个限制,以便开发人员不会被诱惑在不应该使用该类的地方使用它。否则他们最终会在服务层等地方使用它,而我将感到不满意 :-) - Darin Dimitrov
为什么你没有访问它的权限?你只需要检查一下是否在Asp.net线程中(通过检查(HttpContext.Current != null)),我不明白为什么在静态类中这是不可能的。这将防止在非Web应用程序类型中调用你的功能。 - Robert Koritnik
@Robert Koritnik,在非Web应用程序中,根本不应该使用这个类。而且我讨厌编写无法进行单元测试的代码。此外,我希望我的代码能够自解释。开发人员只需查看方法签名,就能知道在哪里可以使用它。而如果取消这个限制,他可能会对自己说:“这个方法真棒,让我来使用一下。”然后他将其导入到他的WinForms应用程序中,直到运行时才意识到他犯了一个错误。 - Darin Dimitrov
我欢迎你的决定,只是想知道一些背后的原因。我同意你的看法。当然,主要问题在于OP想在哪里使用这个功能,是在外部控制器/视图中。 - Robert Koritnik
显示剩余2条评论

1
主要问题当然是: 如果不是在控制器或视图中,您想从哪里获取URL? Asp.net MVC应用程序中还有哪些地方?

如果您正在谈论未意识到Web UI前端的其他应用程序层,则会有一些棘手。这些应用程序(程序集)可以具有自定义配置,您可以在其中放置Web应用程序路径根,然后它们可以使用该路径。但是您必须为生产环境更改它。

或者向您的其他应用程序添加System.Web引用,并访问Darin向您展示的当前HttpContext,这是一种更好的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接