Относительный путь контента в областях MVC3 - PullRequest
15 голосов
/ 27 февраля 2011

Я нашел этот вопрос Не могу использовать относительные пути с областями в ASP.NET MVC 2 , что является той же проблемой, что и у меня. Это все еще так в MVC3?

Есть ли способ сохранить файлы содержимого в области относительно этой области?

Так что файл макета в области может иметь что-то вроде

Без необходимости делать полностью квалифицированную ссылку, требуя каталог областей и имя области или решение вышеуказанного вопроса, для которого требуется проверка каждой области в каждом запросе.

обновление / редактирование

Я решил использовать как решение из приведенного выше вопроса, так и решение ниже (html helper) - в зависимости от проекта / ситуации. Моя реализация вышеупомянутого использует app.setting для хранения имен областей и расширений, чтобы я мог просто иметь модуль как часть моей библиотеки.

var context = HttpContext.Current;
var path = context.Request.Path;
var list = ...       //code that gets from app.config and then saves it
var extensions = ... // to the cache as non-removable with a dependency on web.config
foreach (var area in list)
{
   if (!path.Contains(area + "/")) continue;
   foreach (var extension in extensions)
   {
      if (path.EndsWith("." + extension))
      {
         context.RewritePath(path.Replace(area + "/", "Areas/" + area + "/"));
      }

    }
 }

Ответы [ 5 ]

18 голосов
/ 19 апреля 2011

Мне лично нравится маршрут метода расширения, основываясь на первом ответе, который я придумал, и проверил, что он работает ... Вместо использования @Url.Content используйте @Url.ContentArea и не нужно вводить '~ /' , '/' или '../' и т. д.

Помощник делает некоторые проверки, чтобы автоматически удалить их, так что просто используйте как это ...

@Url.ContentArea("Content/style.css") or @Url.ContentArea("Images/someimage.png") :)

Когда вы создаете это расширение Url Helper, по вашему выбору, но я создал папку «Помощники» из корня сети, тогда я включаю @using YourWebNameSpace.Helpers; в мою _Layout.cshtml (razor / masterpage) в любую «область» Я нахожусь.

Вы по-прежнему можете использовать @Url.Content для ссылок за пределами текущей области (в основном вы можете смешивать в зависимости от необходимого ресурса и его местоположения).

namespace YourWebNamespace.Helpers
{
    public static class UrlHelperExtensions
    {
        public static string ContentArea(this UrlHelper url, string path)
        {
            var area = url.RequestContext.RouteData.DataTokens["area"];

            if (area != null)
            {
                if (!string.IsNullOrEmpty(area.ToString()))
                    area = "Areas/" + area;

                // Simple checks for '~/' and '/' at the
                // beginning of the path.
                if (path.StartsWith("~/"))
                    path = path.Remove(0, 2);

                if (path.StartsWith("/"))
                    path = path.Remove(0, 1);

                path = path.Replace("../", string.Empty);

                return VirtualPathUtility.ToAbsolute("~/" + area + "/" + path);
            }

            return string.Empty;
        }
    }
}

на главной странице или на любой странице (Razor только для этого примера) ...

@using YourWebNamespace.Helpers

<html lang="en">
<head>

    <link href="@Url.ContentArea("Content/reset.css")" media="screen" rel="stylesheet" type="text/css" />

    <link href="@Url.ContentArea("Content/style.css")" media="screen" rel="stylesheet" type="text/css" />

</head>
<body>
4 голосов
/ 28 февраля 2011

Вы можете попробовать создать расширение на HtmlHelper, чтобы решить эту проблему:

public static string Image(this HtmlHelper html, string imagePath)
{
    var area = html.ViewContext.RouteData.Values["area"];
    if (!string.IsNullOrEmpty(area))
        area = "Areas/" + area + "/";
    return VirtualPathUtility.ToAbsolute("~/" + area + "Content/img/" + imagePath);
}

, так что, по вашему мнению, вы можете использовать:

<img src="@Html.Image("myimage.png")" alt="..." />

Я не пробовал код, такпоправьте меня, если я ошибаюсь.

2 голосов
/ 23 февраля 2012

У меня просто была похожая проблема в таблице стилей, которую я решил, просто указав оба относительных пути:

#searchbox {
    ...
    background: url("../Content/magglass.png") no-repeat;
    background: url("../../Content/magglass.png") no-repeat;
    ...
}
1 голос
/ 28 сентября 2011

Я использовал приведенные выше UrlHelperExtensions для некоторых изображений, которые я использую на своей главной странице в качестве данных для прокручиваемого баннера jQuery.Мне пришлось добавить следующее предложение else, чтобы помощник возвращал путь, когда области не было:

        else
        {
            if (path.StartsWith(@"~/"))
            {
                var result = VirtualPathUtility.ToAbsolute(path);
                return result;
            }
        }

        return string.Empty;

На странице просмотра я использовал:

<img src="@Url.ContentArea("~/images/ScrollPicture1.png")" alt="Gallery picture 1" />

Спасибо за публикациюэто решение.Прекрасно работает с моим исправлением для изображений.

0 голосов
/ 27 февраля 2011

У меня были похожие проблемы с моим веб-приложением ASP.NET MVC 3, и я исправил его запись вместо

<img src="mypath/myimage.png" alt="my alt text" />

это:

<img src='@Url.Content("mylink")' alt="my alt text" />

где последняя mylink - это путь типа ~ / mypath. Я использовал это, чтобы связать мои файлы JavaScript, однако я не пробовал это с изображениями или ссылками, поэтому вы должны попробовать сами ...

...