asp.net mvc图像路径和虚拟目录

时间:2011-06-28 15:39:04

标签: c# asp.net asp.net-mvc-2

我知道这必须是重复的,但我一直在涉及这方面的大量信息,我无法让它发挥作用。

我正在尝试让一个站点在客户端的服务器上工作,并且他们将该站点安装在虚拟目录中。我本地没有这个设置,所以我在这里失明。

我正在尝试构建图像的路径。 (这是Facebook OpenGraph元数据)。

我需要图像的路径是一个完全合格的绝对网址。我尝试过很多东西,但似乎没什么用。下面的代码输出一个相对url,但这不起作用。

<% var urlHelper = VirtualPathUtility.ToAbsolute("~/static/images/image.jpg");%>
<meta property="og:image" content="<%=urlHelper%>" />

输出:

<meta property="og:image" content="/static/images/image.jpg" /> 

我也试过了:

<% var serverHost = HttpContext.Current.Request.Url; %>
<meta property="og:image" 
          content="<%=serverHost + "/static/images/image.jpg"%>" />

但那产生了:

<meta property="og:image" 
   content="http://localhost:51863/ViewFile.aspx/static/images/image.jpg" />

我正在寻找http://example.com/virtualdirectory/static/images/image.jpg

任何帮助将不胜感激。我真的不想对网址进行硬编码。

谢谢, 斯科特

修改

我忽略了提到我的第一次尝试是Url.Content(“〜/ .... jpg)但输出相对网址,而不是绝对网址。

4 个答案:

答案 0 :(得分:11)

此代码

public static class Helpers
{
  public static Uri FullyQualifiedUri( this HtmlHelper html , string relativeOrAbsolutePath )
  {
    Uri        baseUri  = HttpContext.Current.Request.Url ;
    string     path     = UrlHelper.GenerateContentUrl( relativeOrAbsolutePath, new HttpContextWrapper( HttpContext.Current ) ) ;
    Uri        instance = null ;
    bool       ok       = Uri.TryCreate( baseUri , path , out instance ) ;
    return instance ; // instance will be null if the uri could not be created
  }
}

应该适用于你可以抛出的任何URI。

有一点需要注意:页面相对URI(例如foo/bar/image.png)可能无法解析您认为的方式,特别是如果URI引用目录,那么您将获得默认页面(即http://localhost/foo/bar可能是一个实际的资源,在这种情况下URI是完整的,或者它可能是不完整的,在这种情况下,Asp.Net MVC的路由填充空白。所有请求都是原始URI。如果你想要解决此问题,您需要获取请求的RouteData并查询详细信息。

以下是使用以http://localhost/MyApp为根的网络应用程序解决问题的方法,并以About控制器的Home视图的不同方式调用Html帮助程序方法。

  • ~
    • 解析为http://localhost/MyApp/
  • /
    • 解析为`http:// localhost /
  • ~/
    • 解析为http://localhost/MyApp/
  • foo/bar/myImage.png
    • 解析为http://localhost/MyApp/Home/foo/bar/myImage.png
  • /foo/bar/myImage.png
    • 解析为http://localhost/foo/bar/myImage.png
  • ~/foo/bar/myImage.png
    • 解析为http://localhost/MyApp/foo/bar/myImage.png
  • http://somesite.com/foo/bar/myImage.png
    • 解析为http://somesite.come/foo/bar/myImage.png
  • http://somesite.com:123/foo/bar/myImage.png
    • 解析为http://somesite.come:123/foo/bar/myImage.png
  • ftp://somesite.com/foo/bar/myImage.png
    • 解析为ftp://somesite.come:123/foo/bar/myImage.png
  • mailto://local-part@domain.com
    • 解析为mailto:local-part@domain.com

答案 1 :(得分:8)

您可以编写一个小扩展方法:

public static class UrlExtensions
{
    public static string AbsoluteContent(this UrlHelper url, string contentPath)
    {
        var requestUrl = url.RequestContext.HttpContext.Request.Url;
        return string.Format(
            "{0}{1}",
            requestUrl.GetLeftPart(UriPartial.Authority),
            url.Content(contentPath)
        );
    }
}

然后:

<meta property="og:image" content="<%= Url.AbsoluteContent("~/static/images/image.jpg") %>" />

将输出例如:

<meta property="og:image" content="http://localhost:7864/static/images/image.jpg" />

答案 2 :(得分:1)

您应该使用路由来解析您的网址。

我个人喜欢关注best practices guide here

  

创建UrlHelper的扩展方法   从Route

生成你的网址

您可能想要这些静态图像的扩展方法:

public static string StaticImage(this UrlHelper helper, string fileName)
    {
        return helper.Content("~/static/images/{0}".FormatWith(fileName));
    }

然后你可以这样做:

<meta property="og:image" content="<%: Url.StaticImage("image.jpg") %>" />

答案 3 :(得分:1)