asp.net путь к образу mvc и виртуальный каталог - PullRequest
2 голосов
/ 28 июня 2011

Я знаю, что это должен быть дубликат, но я разбираюсь с кучей информации об этом, и я не могу заставить ее работать.

Я пытаюсь заставить сайт работать надсервер клиента, и у них есть сайт, установленный в виртуальном каталоге.У меня нет этой настройки, локально, поэтому я летаю вслепую.

Я пытаюсь построить путь к изображению.(это для метаданных OpenGraph Facebook).

Мне нужен путь к изображению, чтобы он был полностью определенным, абсолютным URL.Я пробовал так много вещей, но ничего не получается.Приведенный ниже код выводит относительный 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.

Спасибо, Скотт

EDIT

Я не упомянул, что моей самой первой попыткой был Url.Content("~ / .... jpg), но при этом выводится относительный URL, а не абсолютный.

Ответы [ 4 ]

11 голосов
/ 28 июня 2011

Этот код

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 и который вызывает вспомогательный метод Html различными способами из представления About контроллера Home.

8 голосов
/ 28 июня 2011

Вы можете написать небольшой метод расширения:

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" />
1 голос
/ 28 июня 2011

Используйте метод Content на UrlHelper.

http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.content.aspx

1 голос
/ 28 июня 2011

Вы должны использовать маршрутизацию для разрешения ваших URL.

Лично мне нравится следовать руководству по лучшим практикам здесь до:

Создание методов расширения UrlHelper создать ваш URL из маршрута

Скорее всего, вам понадобится метод расширения для следующих статических изображений:

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") %>" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...