我正在编写一个Orchard主题,我希望能够找到一些与主题一起打包的资源(图像/ swfs等)。
这样做的最佳方式是什么?
我已经使用builder.Add.DefineResource查看了ResourceManifest文件,但我似乎无法在视图中找到它的对应物。 或者我只是把完整的路径放在哪里?
任何提示?
干杯 卡尔
答案 0 :(得分:6)
如果您需要定义新资源(脚本或样式表):
例如:
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")
包含文件将在相应的Style
或Scripts
文件夹中查找该特定资源:对于@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)]
时才有效