在ASP.Net MVC中获取任何文件的完整URL

30

我想在MVC中生成任何文件的完整URL(包括域名等)。例如:一个.jpg文件或exe文件。

例子:如果我提供“~/images/abc.jpg”,它应该返回“http://www.mywebsite.com/images/abc.jpg

我知道有一个带有协议参数的Url.Action重载方法。但是Url.Action只能用于操作。

我想要像Url.Content函数一样,可以带有协议参数的方法。

你知道有什么方法可以获得任何文件的完整URL吗?

我已经尝试了:VirtualPathUtility.ToAbsoluteResolveClientUrlResolveUrl,但这些都似乎不起作用。

3个回答

59
new Uri(Request.Url, Url.Content("~/images/image1.gif"))

1
我不确定哪种方法最有效,但我发现这是最容易使用和记忆的方法。 - Matthew Hudson
3
这应该是答案!它由.NET默认简单地完成,因此具有最佳的灵活性和可维护性。 - Kat Lim Ruiz
很漂亮,但对我没用。我仍然得到类似于main/images/load.png的东西,缺少域名。 - fiberOptics
你会如何在视图中使用这个?我尝试将它赋值给一个JavaScript变量,结果出现了500错误。 - undefined
@RobertSmith 你可能需要使用 Uri.AbsoluteUri 来获取一个字符串。 - undefined

51
你可以使用以下代码将"~/"替换为绝对URL。
System.Web.VirtualPathUtility.ToAbsolute("~/")

编辑:

首先,您需要定义一个方法。

public static string ResolveServerUrl(string serverUrl, bool forceHttps)
{
    if (serverUrl.IndexOf("://") > -1)
        return serverUrl;

    string newUrl = serverUrl;
    Uri originalUri = System.Web.HttpContext.Current.Request.Url;
    newUrl = (forceHttps ? "https" : originalUri.Scheme) +
        "://" + originalUri.Authority + newUrl;
    return newUrl;
} 

现在调用这个方法将返回完整的绝对URL。

ResolveServerUrl(VirtualPathUtility.ToAbsolute("~/images/image1.gif"),false))

输出结果将为 http://www.yourdomainname.com/images/image1.gif


2
以上代码返回“/”。就是这样。不包括协议和域名,例如http://www.mywebsite/。 - Gautam Jain
我已经更新了答案。现在它将满足要求。 - Adeel
添加字符串并不是最干净的方式。你应该使用内置类,如Uri或UriBuilder。 - arni
太好了。我将您的代码与此处的答案 https://dev59.com/2G035IYBdhLWcg3wPdcS 结合起来,提供了一个 @Url.Absolute 扩展方法。谢谢。 - iCollect.it Ltd

-5

试试用这个。

Url.Action("~/images/image1.gif", "/", null, Request.Url.Scheme)

2
OP谈到了与这个确切解决方案相关的问题。正确答案是在3年前提问2个小时后给出的。 - OGHaza
这个实际上几乎可以工作,但是如果图像文件夹位于当前视图的更高级别,它会添加一个额外的路径级别。 - undefined

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