【问题标题】:How to locate resources in Orchard如何在果园中找到资源
【发布时间】:2011-09-23 15:22:41
【问题描述】:

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

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

我使用 builder.Add.DefineResource 查看了 ResourceManifest 文件,但我似乎无法在视图中找到它的对应文件。 还是我只输入完整路径?

有什么提示吗?

干杯 卡尔

【问题讨论】:

  • 据我了解,如果您想让资源可用于其他模块,您只会使用 builder.Add.DefineResource。您是只是在您的主题中引用内容,还是试图将内容提供给其他主题/模块?
  • 我只是想在当前主题/模块中引用它。

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


【解决方案1】:

只是一个旁注:

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

【讨论】:

    【解决方案2】:

    需要明确的是,根据您的情况,有几种方法。我将概述我所知道的最常见的。

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

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

    包含文件将在相应的StyleScripts 文件夹中查找该特定资源:对于@Script.Include("YourPartEdit"),它将在脚本文件夹中查找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 页面上 - 您现在将成功地在网站上的任何位置提供图片。

    这些特定的技术应该适用于多种情况。

    【讨论】:

      【解决方案3】:

      我为类似的问题拼凑了一个扩展方法:

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

      它没有经过很好的测试,可能会使用一些错误处理,但它对我有用。

      【讨论】:

        【解决方案4】:

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

        1. 创建一个继承 IResourceManifestProvider 的类
        2. 提供void BuildManifests(ResourceManifestBuilder builder)方法和
        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");
            }
        }
        

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

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

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

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

        【讨论】:

        • 嗨 - 谢谢。不幸的是,我追求的资源不是样式或脚本 :) 并且能够任意将它们放置在视图中。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 2016-10-26
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多