Как найти ресурсы в саду - PullRequest
6 голосов
/ 27 июня 2011

Я пишу тему Orchard, и я хотел бы иметь возможность найти некоторые ресурсы, поставляемые с этой темой (изображения / swfs и т. Д.).

Каков наилучший способ сделать это?

Я просматривал файлы ResourceManifest, используя builder.Add.DefineResource, но я не могу найти его аналог в представлении. Или мне просто указать полный путь?

Есть подсказки?

Приветствие Карл

Ответы [ 5 ]

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

Если вам нужно определить новый ресурс (скрипт или таблицу стилей):

  1. Создание класса, наследующего IResourceManifestProvider
  2. Укажите void BuildManifests (построитель ResourceManifestBuilder) и
  3. Добавьте все необходимые ресурсы с помощью builder.Add (). DefineStyle ("") или builder.Add (). DefineScript (...), , как вы отметили в ваш вопрос.

Например:

public class ResourceManifest : IResourceManifestProvider {
    public void BuildManifests(ResourceManifestBuilder builder) {
        var manifest = builder.Add();
        manifest.DefineStyle("MyStyle").SetUrl("mystyle.css");
        manifest.DefineScript("MyScript").SetUrl("myscript.js").SetDependencies("jQuery");
    }
}

Это определяет один стиль и сценарий, который вы можете использовать в своих представлениях. URL-адреса относятся к папкам / Styles (или / Scripts) в вашей теме / модуле, где расположен класс .

Если вы хотите повторно использовать некоторые из уже определенных ресурсов (во всех включенных модулях и темах), это так же просто, как написать, например ::

...
@{
    Style.Require("MyStyle").AtHead();
    Script.Require("MyScript").AtFoot();
}
...

внутри вашего .cshtml файла просмотра. В приведенном выше примере mystyle.css и myscript.js будут вставлены в соответствующие места (верхний / нижний колонтитул последней страницы).

5 голосов
/ 13 февраля 2012

Я собрал метод расширения для аналогичной проблемы:

public static string ResourceUrl(this HtmlHelper helper, string resourceType, string resourceName)
{
    var manager = helper.Resolve<IResourceManager>();
    var settings = new RequireSettings { Type = resourceType, Name = resourceName, BasePath = resourceType };
    var resource = manager.FindResource(settings);
    var context = new ResourceRequiredContext { Resource = resource, Settings = settings };

    var url = context.GetResourceUrl(settings, "/");

    return url;
}

Определение манифеста ресурса:

manifest.DefineResource("Content", "MyImage").SetUrl("Content/myimage.png");

Просмотр использования:

@Html.ResourceUrl("Content", "MyImage")

Он не очень хорошо протестирован и, возможно, может использовать некоторую обработку ошибок, но он работает для меня.

3 голосов
/ 08 мая 2013

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

Прежде всего, есть включение внешнего скрипта или таблицы стилей в вашу конкретную часть или тему.Стандартный синтаксис в шаблоне Razor:

@Style.Include("YourPartEdit")
@Script.Require("jQuery")
@Script.Include("YourPartEdit")

Включаемые файлы будут искать этот конкретный ресурс в соответствующей папке Style или Scripts: для @Script.Include("YourPartEdit") он будет выглядеть впапка scripts для YourPartEdit.js.

Возможно, вы заметили, что с помощью Script.Require вы можете зарегистрировать библиотеку в Orchard (в данном случае зарегистрированной - jQuery), и заставить модуль требовать этот конкретныйскрипт.

Для этого вы создаете собственную реализацию интерфейса IResourceManifestProvider, реализуете метод BuildManifests(ResourceManifestBuilder builder) и создаете именованный ресурс.Вы можете использовать .AtFoot() или .AtHead(), чтобы даже нацелить, куда оно пойдет.

Теперь скажите, что вы хотите сослаться на определенное изображение, и вы хотите использовать Razor, чтобы всегда указывать на правильный URL-адрес изображения.Прежде всего, я рекомендую поместить изображение в папку Content для вашей темы (при условии, что это изображение, связанное с темой), и вы сделаете что-то вроде этого:

<img src=@Url.Content(Html.ThemePath(WorkContext.CurrentTheme, "/Content/your-logo.png")) />

Теперь, скажите этонаходится на вашей странице Layout.cshtml - теперь вы успешно разместите изображение в любом месте сайта.

Эти конкретные методы должны учитывать множество ситуаций.

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

В таблицах стилей следует использовать относительные пути (из пути таблицы стилей).

В представлениях следует использовать Url.Content.

1 голос
/ 16 февраля 2015

Примечание:

решение , опубликованное Адамом Андерсоном , работает только тогда, когда класс контроллера, обслуживающий представление, имеет атрибут [Orchard.Themes.Themed(true)]

...