如何在Orchard中找到资源

时间:2011-06-27 15:49:27

标签: asp.net asp.net-mvc asp.net-mvc-3 resources orchardcms

我正在编写一个Orchard主题,我希望能够找到一些与主题一起打包的资源(图像/ swfs等)。

这样做的最佳方式是什么?

我已经使用builder.Add.DefineResource查看了ResourceManifest文件,但我似乎无法在视图中找到它的对应物。 或者我只是把完整的路径放在哪里?

任何提示?

干杯 卡尔

5 个答案:

答案 0 :(得分:6)

如果您需要定义新资源(脚本或样式表):

  1. 创建一个继承 IResourceManifestProvider
  2. 的类
  3. 提供 void BuildManifests(ResourceManifestBuilder构建器)方法和
  4. 通过 builder.Add()。DefineStyle(“”) builder.Add()。DefineScript(...),添加所有必要资源在你的问题中提到。
  5. 例如:

    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");
        }
    }
    

    这定义了一个可以在视图中重用的样式和脚本。 Urls与您所在的主题/模块中的/ Styles(或/ Scripts)文件夹相关

    如果你想重用已经定义的一些资源(在所有已启用的模块和主题中),那就像编写例如:。

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

    在.cshtml视图文件中。上面的示例将在适当的位置(最后一页的页眉/页脚)注入 mystyle.css myscript.js

答案 1 :(得分:5)

我为同样的问题打了一个扩展方法:

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")

它没有经过良好测试,可能会使用一些错误处理,但它可以为我工作。

答案 2 :(得分:3)

为了清楚起见,根据您的情况,有一些方法。我将概述我所知道的最常见的内容。

首先,在您的特定部分或主题上包含外部脚本或样式表。 Razor模板中的标准语法是:

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

包含文件将在相应的StyleScripts文件夹中查找该特定资源:对于@Script.Include("YourPartEdit"),它将在脚本文件夹中查找YourPartEdit.js。< / p>

您可能已经注意到,使用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页面上 - 您现在可以在网站的任何位置成功投放图片。

这些特殊技术应该考虑到很多情况。

答案 3 :(得分:2)

在样式表中,应使用相对路径(来自样式表路径)。

在视图中,您应该使用Url.Content。

答案 4 :(得分:1)

只是旁注:

solution posted by Adam Anderson仅在为视图提供服务的控制器类具有属性[Orchard.Themes.Themed(true)]时才有效